【问题标题】:generics unchecked warning conversion泛型未经检查的警告转换
【发布时间】:2014-12-01 13:23:24
【问题描述】:

我在泛型中读到“?扩展对象”和“?”是同义词,那么为什么会发生这种情况。

List list=new ArrayList();
List<? extends Object> list2=list;     //1
List<?> list3=list;                    //2

对于 1 会抛出未经检查的转换警告,但对于 2 则不会。因此,某处的编译器肯定会区分两者。 请根据上述代码解释两者之间的区别

【问题讨论】:

  • 两者都在 IntelliJ 上工作。
  • @Smutje 这是什么意思?

标签: java generics collections


【解决方案1】:

我在泛型中读到“?扩展对象”和“?”是同义词

不完全是。第一个通配符有下限,第二个没有。对于您的两个示例,它应该没有区别(好吧,除了您只能将null 添加到list2list3!)。

这个下限可以有所作为:“擦除签名”(我不知道确切的术语)。

最好的例子是Collections.max();你会注意到参数类型被定义为T extends Object &amp; Comparable&lt;? super T&gt;

这是因为在 Java 5 之前存在此方法并被定义为:

static Object max(Collection coll)

如果类型参数定义为T extends Comparable&lt;? super T&gt;,这意味着1.4 中的方法必须返回Comparable

【讨论】:

    【解决方案2】:

    由于某些类型信息在编译期间会被删除,因此并非所有类型在运行时都可用。在运行时完全可用的类型称为reifiable types(请参阅http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.7)。

    所以根据 JLS,List&lt;?&gt; 是可具体化的类型,但 List&lt;? extends Object&gt; 不是,这意味着从编译器的角度来看它们并不相同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-03
      • 2013-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多