<! - ? - >和<! - ?之间的区别扩展对象 - >

时间:2013-12-11 19:24:54

标签: java generics

我有这个代码给我一个抑制警告

public Class getColumnClass(int column) {
        return getValueAt(0, column).getClass();
    }

该错误提到了接受未经检查的转化的内容,因此我尝试添加Class<?>,但它也建议放入Class<? extends Object>。我以前读过这个,但我不记得在哪里。我认为<?>意味着它接受任何对象,? extends Object必须意味着该类是Object的子类,但它不是同一个东西吗?这两个例子都没有给我任何错误。

2 个答案:

答案 0 :(得分:1)

没有区别,它们是同义词。 I found a good answer for the same question

通过@ruakh:

<?><? extends Object>是同义词,正如您所期望的那样,但有一些仿制药的情况extends Object实际上并不多余。例如,<T extends Object & Foo>会导致T在删除时变为Object,而<T extends Foo>则会在删除时变为Foo。 (如果您尝试保留与使用Object的pre-generics API的兼容性,这可能很重要。)

答案 1 :(得分:1)

他们都是同义词。所以没有区别

同时检查一下: - Converting Legacy Code to Use Generics

同样在this问题中回答notnoop,两者之间存在很小的差别:

  
      
  1. JVMS(Java虚拟机规范)对无界通配符有一个特殊规范,如ClassFileFormat-Java5   指定无界通配符编码为*,同时编码为   对象有界通配符为+ Ljava / lang / Object;。这种变化会泄漏   通过任何分析字节码的库。编译器编写者会   也需要处理这个问题。从修订版到“类文件”   格式为“

  2.   
  3. 从可再生性的角度来看,这些是不同的。 JLS 4.6和4.7将List<?>编码为可再生类型,但List<? extends Object>为a   擦除类型。任何库编写者添加.isReifiable()(例如mjc lib)   需要考虑到这一点,要遵守JLS术语。来自JLS   4.6和4.7。

  4.