2012-02-17 54 views
0

这里有一个简单的例子:Java泛型 - 何时需要参数化?

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;是否确实丑陋在你看来,有没有更好的方法来解决这个问题?谢谢!

+3

请记住,Java有类型擦除;无论有多少种不同的方式来实例化World类(因为它们都与运行时一样共享相同的类),只有一个静态的'world'变量。 – 2012-02-17 20:02:55

+0

我不会让世界成为单身/静态。当你在两个世界存在的情况下写一个不同的游戏时会发生什么?无论如何,在我看来,这取决于你的'GAME'包中的任何内容,以确保_it_只创建一个'World'。这在现在的方式回答你的问题,它避免了这个问题。 – 2012-02-17 20:33:48

+0

好点...其实我的GAME包实现了一个传统的单身人士,以确保只有一个... – pitosalas 2012-02-18 22:44:57

回答

4

您不能在静态方法或字段中访问泛型类型参数,如this answer中所述。由于静态字段在类的所有实例之间共享(在这种情况下,我猜你的类将是型号),这将如何同时适用于Model<Sprites, Bodies>Model<ClassA, ClassB>

+0

是的,这是非常有意义的......它解释了为什么静态世界未能编译。然而世界如何摆脱它呢? – pitosalas 2012-02-18 22:45:58

+0

@pitosalas因为'?'是一个通配符,意思是“任何类型”。因此,在这种情况下'World '就像是在编写普通的'World',并且不受'Model '的类型参数的约束(记住这是编译错误的根源)。 – 2012-02-18 22:53:46

+0

难道人们认为在这样的情况下写作世界是丑陋的还是完美的清洁?它是否比编写纯净的世界更丑陋,这也被接受并带有警告? – pitosalas 2012-02-18 23:05:58

2

当然,如果你想要一个单例,你必须知道单个实例中引用的确切类型是什么。

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

想想这个名称:“泛型”,它将用于某些将在不同环境中重复使用的内容。就像定义一个树结构的类一样,它可以容纳任何类的对象。有时很难判断您是否需要仿制药。但是,单身绝对是极性相反的;没有什么比单身人士更通用:一个班级,一个单一的实例。

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 2012-02-18 22:48:29

+0

@pitosalas也许一个更大的代码样本和一些解释可以帮助我们确定您需要的解决方案。就目前而言,你的问题的答案确实是你无法参数化静态字段。 – biziclop 2012-02-19 13:34:37

+0

我毫不犹豫地给这个列表加上一个更长的代码示例......我不想被打耳光:) – pitosalas 2012-02-20 14:28:15