在Java中,有什么区别:
public void foo(List lst);
和
public void foo(List<?> lst);
答案 0 :(得分:0)
第一个版本是任何类型的列表&#39;。这不是通用的,不安全,不推荐。
第二个版本是未知类型的列表&#39;。这意味着您将get
最常用类型Object
的对象,并且无法add
除null
以外的任何其他对象。因为当对类型一无所知时,这些是唯一的类型安全操作。
您可能认为版本版本更简洁,而且确实如此。然而鸭子类型的语言往往更简洁,但这并不能使它们成为正确的选择。只有向后兼容性才能使用原始List
,并且您将收到编译器警告。
为了获得更多乐趣,请考虑以下类型,以及它们与您的两种类型的区别:
foo(List<Object> list)
foo(List<? extends Object> list)
foo(List<? super Object> list)
foo(List<? super Iterable<? extends Object>> list)
答案 1 :(得分:-1)
AFAIK:
仅使用List lst是原始类型,因此不是类型安全的。它只会在强制转换时生成运行时错误。当演员表不好时我们想要编译时错误。不建议使用。有关原始类型的其他信息:What is a raw type and why shouldn't we use it?
对于List:是一个无界的通配符。