<分区>
我有两个类,Foo 和 Bar,带有类型声明:
class Foo<T>
class Bar<Foo>
这会导致编译器警告,因为 Bar 中的 Foo 参数没有参数化。理想情况下,我想避免编译器警告,但我确实希望 Bar 接受任何 Foo。所以我尝试了这个:
class Foo<T>
class Bar<Foo<?>>
这似乎工作正常,但我担心我可能遗漏了细微的差别。有吗?
<分区>
我有两个类,Foo 和 Bar,带有类型声明:
class Foo<T>
class Bar<Foo>
这会导致编译器警告,因为 Bar 中的 Foo 参数没有参数化。理想情况下,我想避免编译器警告,但我确实希望 Bar 接受任何 Foo。所以我尝试了这个:
class Foo<T>
class Bar<Foo<?>>
这似乎工作正常,但我担心我可能遗漏了细微的差别。有吗?
最佳答案
是的,有。考虑这个 -
List<?> myList;
除 null 外,您不能将任何内容放入此列表。除了 Object
之外,您也无法从此列表中获取任何内容。因此,编译器不允许您通过添加不同类型的对象来破坏此列表的类型不变性。如果您尝试这样做,您将遇到编译时错误。
但是如果您考虑以下列表(原始类型)-
List myList;
然后你可以从这里放任何东西/得到任何东西。因此,可以通过放置不同类型的对象轻松地破坏此列表,并且您只能在运行时从 ClassCastException
中发现这一点(如果您幸运的话......)。
因此,对于您的情况,请使用以下方法 -
class Foo<T>
class Bar<Foo<?>>
如果可以的话,远离第一个。
有关更多信息,请查看 Effective Java -
关于java - Foo<?> 是否等同于未参数化的 Foo?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18546770/