将参数转换为泛型变量时的 Java 方法多态性

标签 java generics casting polymorphism

给定以下类(class)

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 方法多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47426701/

相关文章:

c++ - 将字节数组转换为 float

java - 使用 JODA API 计算夏令时的剩余天数

java - 可以手动将 JSON 或 JSONB postgresql 数据类型与 spring r2dbc 一起使用吗?

c# - 为什么泛型方法不能推断参数类型?

Java:如何在运行时获取泛型类型?

c++ - 转换成本

java - ant task/Hash.from_java_properties 的 Apache Buildr 问题

java - dwr 中的透明批处理远程调用

java - 我可以用泛型形式声明一个类,然后将子类转换为在 java 中声明为泛型的类型吗

java - 类类型转换不明确