2013-12-11 46 views
0

我有这样的代码,是给我一个取消警告<?>与<?扩展对象>

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

的错误中提到了一些关于接受一个未经检查的转换,所以我尝试添加Class<?>但它也建议把在Class<? extends Object>。我之前已经阅读过这篇文章,但我不记得在哪里。我认为<?>表示它接受任何对象,并且? extends Object必须表示这个类是Object的一个子类,但不是那样的东西?这两个例子都没有给我错误。

+0

这个问题已经回答了[这里] [1],看看吧:) [1]:http://stackoverflow.com/questions/14346622/list- vs-list-extends-object – heyHugo

+0

啊我应该知道,谢谢。 – gallly

回答

1

它们都是同义词。因此,有没有区别

还检查了这一点: - Converting Legacy Code to Use Generics

而且在this问题有两个之间有非常微小的差别notnoop回答:

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

  2. 从reifiablity的角度来看,这些是不同的。 JLS 4.6和4.7编纂List<?>作为reifiable类型,但List<? extends Object>作为 erasured类型。任何添加.isReifiable()(例如mjc lib) 的库编写者都需要考虑这一点,以遵守JLS术语。来自JLS 4.6和4.7。

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的预泛型API的兼容性,则这可能很重要。)