2013-08-31 31 views
3

我有两个班,Foo和酒吧,与类型声明:Foo <?>是否等同于非参数化的Foo?

class Foo<T> 
class Bar<Foo> 

这将导致一个编译器警告,如酒吧foo的参数不paramaterised。理想情况下,我想避免编译器警告,但我希望Bar接受任何Foo。所以我试过这个:

class Foo<T> 
class Bar<Foo<?>> 

这似乎工作正常,但我担心可能有一个微妙的差异我失踪。在那儿?

+2

声明一个类为'Bar >'是一个语法错误 - 也许你的意思是声明一个*变量*为'Bar >'。 –

回答

5

是的,有。考虑这个 -

List<?> myList; 

你不能把任何东西放到这个列表中,除了空。除了Object之外,您也无法从此列表中获取任何内容。所以编译器不会允许你通过添加不同类型的对象来破坏这个列表的类型不变性。如果你尝试这样做,你会得到一个编译时错误。

但是如果你考虑以下列表(原始类型) -

List myList; 

然后你被允许把任何东西/从这里得到什么。所以人们可以通过放置不同类型的对象来轻易地破坏这个列表,并且在运行时您只能从ClassCastException中找到这个信息(如果您幸运的话....)。

因此,对于你的情况,用下面的办法 -

class Foo<T> 
class Bar<Foo<?>> 

,如果你可以从第一个望而却步。

欲了解更多信息,请Effective Java -

  1. 项目23 - 不要在新的代码中使用的原始类型
  2. 项目26 - 青睐泛型类型
+0

啊,当然。不幸的是我想我在问错误的问题。可能很快就要问一个相当类似的问题:p – MikeFHay

1

Foo<?>在语义上与Foo<? extends Object>相同:它是一个Foo,其类型参数是特定的,但是on关于“某事”的已知事物是它是Object的一些子类(这不是说太多,因为所有的类都是Object的子类)。

相关问题