有如下例子:
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/