Java Generics - когда требуется параметризация? - PullRequest
0 голосов
/ 17 февраля 2012

Вот простой пример:

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, и я не могу иметь этот пакет (MODEL) в зависимости от этой игры. Поэтому конструктор должен быть МОДЕЛЬ. Поэтому было бы хорошо, если бы Конструктор сохранил объект singleton в статической переменной этого класса в MODEL.

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

Ответы [ 2 ]

4 голосов
/ 18 февраля 2012

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

2 голосов
/ 18 февраля 2012

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

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

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

Ps: Однако есть Enum s, которые являются универсальными и имеют фиксированное число экземпляров, самосвязанные универсальные типы являются решением для этих случаев, но я почти уверен, что вы мне это не нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...