我有这个代码给我一个抑制警告
public Class getColumnClass(int column) {
return getValueAt(0, column).getClass();
}
该错误提到了接受未经检查的转化的内容,因此我尝试添加Class<?>
,但它也建议放入Class<? extends Object>
。我以前读过这个,但我不记得在哪里。我认为<?>
意味着它接受任何对象,? extends Object
必须意味着该类是Object的子类,但它不是同一个东西吗?这两个例子都没有给我任何错误。
答案 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,两者之间存在很小的差别:
JVMS(Java虚拟机规范)对无界通配符有一个特殊规范,如ClassFileFormat-Java5 指定无界通配符编码为*,同时编码为 对象有界通配符为+ Ljava / lang / Object;。这种变化会泄漏 通过任何分析字节码的库。编译器编写者会 也需要处理这个问题。从修订版到“类文件” 格式为“
- 醇>
从可再生性的角度来看,这些是不同的。 JLS 4.6和4.7将
List<?>
编码为可再生类型,但List<? extends Object>
为a 擦除类型。任何库编写者添加.isReifiable()
(例如mjc lib) 需要考虑到这一点,要遵守JLS术语。来自JLS 4.6和4.7。