java - 如何使用泛型调用最具体的方法?

标签 java type-erasure generics

有如下例子:

public class Test {

    public static class A {}

    public static void main(String[] args) {
        A a = new A();
        m1(a);
    }

    public static <T> void m1(T t) {
        // t.getClass().getSimpleName() is A
        // t instanceof A is true
        m2(t);
    }

    /* Not called */
    public static void m2(A a) {
        System.out.println("A");
    }

    public static void m2(Object o) {
        // o.getClass().getSimpleName() is A
        // o instanceof A is true
        System.out.println("O");
    }

}

我不明白为什么选择 m2(Object o) 而不是 m2(A a)。如您所见,调用 m2(t) 时,t“是一个 A”。

输出:

  • 实际

    O
    
  • 预期

    A
    

如何在上述情况下使用泛型,以便选择 m2(A a)


编辑:

我想要一个通用的解决方案,即使我添加类型 B(类似于 A)也能正常工作。

...
public static void main(String[] args) {
    A a = new A();
    m1(a);
    B b = new B();
    m1(b);
}
...
public static void m2(B b) {
    System.out.println("B");
}
...

输出:

  • 实际

    O
    O
    
  • 预期

    A
    B
    

最佳答案

你必须做的:

public static <T extends A> void m1(T t) {
    m2(t);
}

否则,编译器无法推断传递的参数符合 m2(A a) 和 pick m2(Object o)

关于java - 如何使用泛型调用最具体的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29795607/

相关文章:

.net - 为什么在 .NET 框架的某些类中选择 System.Type 参数而不是泛型?

Java 反射无论如何都可以将 Class<?> 或 Type 与 Class<T>? 进行比较?

C++ -& CRTP 。类型删除与多态性

java - "both methods have same erasure"使用有界类型参数时出错

c# - 具有 OR 约束的通用类型属性

java - Java 中菱形运算符 (<>) 的作用是什么?

java - 无法修复 java.lang.ArrayIndexOutOfBoundsException

java - 从文件中读取以逗号分隔的整数到二维数组中

java - 如何从 Java 中的 ActionListener 内部更改变量的值?

java - 使用 servlet/jsp 检查 HTTP 请求是否来自 Android 手机