我有两个类,Foo和Bar,带有类型声明:
class Foo<T>
class Bar<Foo>
Run Code Online (Sandbox Code Playgroud)
这会导致编译器警告,因为Bar中的Foo参数不是参数化的.理想情况下,我想避免编译器警告,但我确实希望Bar接受任何Foo.所以我尝试了这个:
class Foo<T>
class Bar<Foo<?>>
Run Code Online (Sandbox Code Playgroud)
这似乎工作正常,但我担心我可能会有一个微妙的差异.在那儿?
就在这里.考虑一下 -
List<?> myList;
Run Code Online (Sandbox Code Playgroud)
除了null之外,您不能将任何内容放入此列表中.除了一个,你也无法从这个列表中得到任何东西Object
.因此编译器不允许您通过允许添加不同类型的对象来破坏此列表的类型不变量.如果您尝试这样做,您将收到编译时错误.
但是如果你考虑以下列表(原始类型) -
List myList;
Run Code Online (Sandbox Code Playgroud)
然后你可以放任何东西/从这里得到任何东西.所以人们可以通过放置不同类型的对象来轻易地破坏这个列表,并且你只能从ClassCastException
运行时发现这个(如果你幸运的话......).
因此,对于您的情况,请使用以下方法 -
class Foo<T>
class Bar<Foo<?>>
Run Code Online (Sandbox Code Playgroud)
如果可以的话,远离第一个.
有关更多信息,请查看Effective Java -