3

我有两个类,Foo 和 Bar,带有类型声明:

class Foo<T>
class Bar<Foo>

这会导致编译器警告,因为 Bar 中的 Foo 参数未参数化。理想情况下,我想避免编译器警告,但我确实希望 Bar 接受任何 Foo。所以我尝试了这个:

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

这似乎工作正常,但我担心我可能会遗漏一些细微的差别。在那儿?

4

2 回答 2

5

就在这里。考虑一下 -

List<?> myList;

除了 null 之外,您不能将任何内容放入此列表中。除了Object. 所以编译器不允许你通过让你添加不同类型的对象来破坏这个列表的类型不变量。如果您尝试这样做,您将收到编译时错误。

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

List myList;

然后你可以从这里放任何东西/得到任何东西。因此,可以通过放置不同类型的对象来轻松破坏此列表,并且您只能ClassCastException在运行时发现这一点(如果幸运的话....)。

因此,对于您的情况,请使用以下方法 -

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

如果可以,请远离第一个。

有关更多信息,请查看有效 Java -

  1. 第 23 条 -不要在新代码中使用原始类型
  2. 第 26 项 -偏爱泛型类型
于 2013-08-31T09:51:16.490 回答
1

Foo<?>在语义上与Foo<? extends Object>:它是Foo特定事物的 with 类型参数,但关于“事物”的唯一已知是它是 Object 的某个子类(这并没有说太多,因为所有类都是 Object 的子类) .

于 2013-08-31T09:53:59.323 回答