2012-02-17 4 views
0

Вот простой пример:Java Generics - когда требуется параметризация?

class World<S extends Sprites, B extends Bodies> { 

// Both of these have a problem... 

static World world = null; // "World is a raw type. References to generic type 
          // World<BOD,SPRT> should be parameterized" 

static World<S, B> world = null; // "Cannot make a static reference to the non-static type S 
         // "Cannot make a static reference to the non-static type B 

// The following is allowed but looks ugly/fishy to me 
static World<?, ?> world = null; // 

В случае, если вы задаетесь вопросом, я пытаюсь получить одноплодной шаблон собирается. Задача состоит в том, что этот класс расширен в отдельном пакете GAME, и я не могу иметь этот пакет (МОДЕЛЬ), зависящий от этой ИГРЫ. Поэтому конструктор должен быть МОДЕЛЬ. Таким образом, было бы хорошо, если бы Constructor сохранил одноэлементный объект в статической переменной этого класса в MODEL.

Является ли static World<?, ?> world = null; действительно уродливым, на ваш взгляд, и есть ли лучший способ приблизиться к этому? Благодаря!

+3

Помните, что Java имеет стирание типа; будет только одна статическая переменная 'world', независимо от того, сколько различных способов вы создаете класс' World' (поскольку все они имеют один и тот же класс, что и среда выполнения). –

+0

Я бы не сделал World singleton/static в первую очередь. Что происходит, когда вы пишете другую ИГРУ, где существуют два мира? В любом случае, мне кажется, что все, что находится в вашем пакете 'GAME', чтобы убедиться, что _it_ создает только один« Мир ». Это теперь отвечает на ваш вопрос, вместо этого он избегает вопроса. –

+0

Хорошие баллы ... На самом деле мой пакет GAME реализует обычный синглтон, чтобы убедиться, что есть только один ... – pitosalas

ответ

4

Вы не можете получить доступ к параметрам типового типа в статических методах или полях, как указано в this answer. Поскольку статические поля являются общими для всех экземпляров класса (в этом случае, я думаю, ваш класс будет Model), как это будет работать одновременно с Model<Sprites, Bodies> и Model<ClassA, ClassB>?

+0

Да, это имеет смысл ... Это объясняет, почему статический мир не удалось скомпилировать. Однако как мир уйти с ним? – pitosalas

+0

@pitosalas Потому что '?' Является подстановочным знаком, который означает «любой тип».Поэтому 'World ' в этом случае подобен написанию простого «мира» и не ограничивается параметрами типа «Model » (помните, что это был источник ошибки компиляции). –

+0

Неужели люди думают, что пишущий мир в такой ситуации уродливый или это совершенно чистый? Это уродливее, чем писать простой мир, который также принимается с предупреждением? – pitosalas

2

Несомненно, если вы хотите синглтон, вам нужно знать, какие будут точные типы, упомянутые в этом единственном экземпляре.

Возможно, если вы добавите более подробную информацию к вашему примеру, это уже не будет правдой, но, насколько я могу судить, вам не нужны дженерики. Если вы хотите выразить, что поля, которые вы храните Sprites и Bodies, могут быть любыми подклассами этих классов, просто объявите эти поля с этими типами, наследование позаботится обо всем остальном.

Просто подумайте над названием: «generics», оно должно использоваться для чего-то, которое будет повторно использоваться в разных контекстах снова и снова. Как класс, определяющий древовидную структуру, которая затем может содержать любой класс объектов. Иногда трудно сказать, нужны ли вам дженерики или нет. Но синглтон определенно является полярной противоположностью; нет ничего более общего, чем одноэлемент: один класс, один экземпляр.

P.s .: Есть, однако, Enum s, которые являются общими и имеют фиксированное количество экземпляров, self-bound generic types - это решение для этих случаев, но я почти уверен, что вам это не нужно.

+0

Да, я знаю заранее ... Но есть и другие причины, которые приводят меня к использованию дженериков, связанных с сохраняя герметичность упаковки, избегая при этом большого количества раздражающего литья. Фактически модель для этого появилась из другого потока StackOverflow: http://stackoverflow.com/questions/9270466/java-generics-having-trouble-with-a-tricky-situation/9280277#9280277 – pitosalas

+0

@pitosalas Возможно, более крупный код образец и небольшое объяснение могут помочь нам определить нужное вам решение. Как бы то ни было, ответ на ваш вопрос на самом деле заключается в том, что вы не можете параметризовать статическое поле. – biziclop

+0

Я смущаюсь обременять этот список более длинным образцом кода ... Я не хочу, чтобы меня ударили :) – pitosalas

Смежные вопросы