java - 将参数强制转换为泛型变量时的Java方法多态

原文 标签 java generics casting polymorphism

鉴于以下课程

public class Test<T extends Test.UpperClass> {

    public static class BottomClass {}
    public static class UpperClass extends BottomClass {}
    public void method(BottomClass c) {
        System.out.println("BottomClass " + c.getClass());
    }
    public void method(T c) {
        System.out.println("UpperClass " + c.getClass());
    }
    public void test() {
        method(new UpperClass());
    }
    public static void main(String[] args) {
        new Test<UpperClass>().method(new UpperClass()); // calls method(T)
        new Test<UpperClass>().test(); // calls method(BottomClass)
    }
}


上面的代码如果执行,将打印出UpperClass class Test$UpperClassBottomClass class Test$UpperClass,这不是我期望的T extends UpperClass,我希望两者都将调用method(T),因为T的擦除是UpperClass。为什么改为调用method(BottomClass)

最佳答案

让我们简化一下:

public class Foo<T> {
    void method(T t) {}

    void test() {
        method(new Object());  // compiler error: is T Object?
    }

    public static void main(String[] args) {
        new Foo<Object>().test();
        new Foo<String>().test(); // both must compile!
    }
}


上面的方法调用无法编译,因为实例不知道T是什么类型。 ObjectT具有相同擦除的事实在编译时无关紧要。您的示例是一个更复杂的说明。

关于java - 将参数强制转换为泛型变量时的Java方法多态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47426701/

相关文章:

java - 如何在界面上使用转换?

c# - 字符串未被识别为有效的 DateTime "format dd/MM/yyyy"

java - 将“逻辑”移出数据访问层将导致大量数据库连接

java - 如何处理执行许多不同背景更改的Facade方法的错误?

java - 迭代 ResultSet 并将其值添加到 ArrayList 中

c# - 通用参数 : ensure different types

c# - ObservableCollection和IEnumerable的通用方法

java - Jersey @PathParam : how to pass a variable which contains more than one slashes

java - 为什么用Java在数组中删除泛型?

swift - 在 Swift 中类型转换闭包?