java - 具体类不使用通用标识符编译

标签 java generics language-lawyer

这个编译错误让我百思不得其解。考虑下面的代码片段,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/

相关文章:

c++ - template-name<TT> 是推导的上下文吗?

c++ - 在从未实例化的模板中错误使用非相关名称是否需要诊断?

java - 如果不存在则插入?

java - 程序执行停止且不产生错误

Java:如何通过列名检索SQL结果集数据?

java - 无法使用 scala 参数化类型覆盖 java 泛型函数

c# - 当通用决策基于数据库值时,如何使用 C# 泛型来实现此实现

java - 如何限制泛型类型不扩展类?

c++ - clang 或 gcc 关于此内部类成员访问是否正确?

java - 我们如何在下面的格式中设置日期?