这个编译错误让我百思不得其解。考虑下面的代码片段,ConcreteClass1
有以下编译错误:
Error:(16, 28) java: incompatible types: java.util.Map java.lang.String,java.lang.String> cannot be converted to java.util.Map java.lang.String,java.lang.Object>
还ConcreteClass2
编译成功,仅仅是因为它扩展了 AbstractClass
而不是 AbstractClass<Object>
.这是为什么?
abstract class AbstractClass<T extends Object> {
void testGenerics(Map<String, Object> map) {
}
}
class ConcreteClass1 extends AbstractClass<Object> {
public void testGenerics() {
Map<String, String> map = new HashMap<>();
super.testGenerics(map);
}
}
class ConcreteClass2 extends AbstractClass {
public void testGenerics() {
Map<String, String> map = new HashMap<>();
super.testGenerics(map);
}
}
最佳答案
ConcreteClass2
由于省略了通用信息,因此被声明为原始类型。根据 official Raw Types tutorial :
Raw types show up in legacy code because lots of API classes (such as the Collections classes) were not generic prior to JDK 5.0. When using raw types, you essentially get pre-generics behavior
因为以上testGenerics(Map<String, Object> map)
被解释为 testGenerics(Map map)
它可以用任何 Map
调用目的。这一切都是因为与 Java 5 之前的代码向后兼容。
可以看看JLS 4.8 Raw Types .
关于java - 具体类不使用通用标识符编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52402140/