Java 泛型 - 方法覆盖

标签 java generics

我有一对 ClassA 和 ClassB 如下所示。
案例一:

class ClassA<T extends Number>{
    void method(T t){}
}

class ClassB extends ClassA<Integer>{
    @Override
    void method(Integer i){}
}

案例2:

class ClassA{
    void method(Number t){}
}

class ClassB extends ClassA{
    @Override
    void method(Integer i){}
}

我有两个问题。
[q1] 我这样说对吗,case2 是 case1 的运行时表示(类型删除后)?

[q2] 如果我对 [q1] 是正确的,那么为什么 case1 被接受为有效的覆盖? (我知道为什么 case2 不是有效的覆盖,因为参数不一样。)

请有人对此有所了解。 提前致谢。

最佳答案

[q1] 的答案是否定的。 编译器将在 ClassB 中生成一个 bridge 方法,该方法实际上将覆盖 method(Number)

class ClassB extends ClassA{
    // bridge method
    void method(Number i){
        method((Integer)i);
    }

    void method(Integer i){}
}

您将在 java doc 中获得完整的答案关于类型删除。

关于Java 泛型 - 方法覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29296303/

相关文章:

java - 即使输入相同,AES/CBC/NoPadding 是否会生成两个不同的密文?

java初始化流输入/输出变量

java - Servlet 不向 .jsp 文件发送参数

python - 检查对象是否为 typing.Generic 的正确方法是什么?

c# - 泛型语法

C# - 子类类型列表

java - 为静态模拟设置 Powermockito

java - 如何计算我的应用程序中特定事件的耗时?

swift - 如何在 Swift 中使用类型删除静态访问泛型子类型?

generics - 通用类中的编译器错误c1001