野生护理通用与无通用参数之间的区别

时间:2014-11-07 17:19:01

标签: java generics

在Java中,有什么区别:

public void foo(List lst);

public void foo(List<?> lst);

2 个答案:

答案 0 :(得分:0)

第一个版本是任何类型的列表&#39;。这不是通用的,不安全,不推荐。

第二个版本是未知类型的列表&#39;。这意味着您将get最常用类型Object的对象,并且无法addnull以外的任何其他对象。因为当对类型一无所知时,这些是唯一的类型安全操作。

您可能认为版本版本更简洁,而且确实如此。然而鸭子类型的语言往往更简洁,但这并不能使它们成为正确的选择。只有向后兼容性才能使用原始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:是一个无界的通配符。