Java Generics - 什么时候需要参数化?

时间:2012-02-17 19:59:30

标签: java generics inheritance singleton

这是一个简单的例子:

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)对该GAME有任何依赖。因此构造函数必须是MODEL。因此,可以让构造函数将单例对象存储在MODEL中此类的静态变量中。

您认为static World<?, ?> world = null;确实很丑陋,是否有更好的方法来解决这个问题?谢谢!

2 个答案:

答案 0 :(得分:4)

您无法访问静态方法或字段中的泛型类型参数,如this answer中所述。因为静态字段在类的所有实例中共享(在这种情况下,我猜您的类将是模型),这对于Model<Sprites, Bodies>Model<ClassA, ClassB>同时如何工作?

答案 1 :(得分:2)

当然,如果你想要一个单身人士,你必须事先知道那个单一实例中提到的确切类型是什么。

也许如果你为你的例子添加更多细节,这将不再是真的,但据我所知,你不需要这里的泛型。如果您想表示存储SpritesBodies的字段可以是这些类的任何子类,只需使用这些类型声明这些字段,继承将处理其余的。

想想这个名字:“泛型”,它可以用于一次又一次在不同环境中重复使用的东西。就像定义树结构的类一样,它可以保存任何类的对象。有时候很难判断你是否需要泛型。但单身人士肯定是极端对立的;没有什么比单身人士更通用了:一个班级,一个单一的实例。

Ps:有Enum个,它们都是通用的并且具有固定数量的实例,self-bound generic types是这些情况的解决方案,但我几乎可以肯定你不需要此