具有以下示例:
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”。
输出
在上述情况下,我如何使用泛型来选择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");
}
...输出
发布于 2015-04-22 11:17:02
你必须做:
public static <T extends A> void m1(T t) {
m2(t);
}否则,编译器无法推断传递的参数与m2(A a)和pick m2(Object o)兼容。
发布于 2015-04-22 20:36:03
您正在寻找Java不支持的双重调度。我不认为泛型在这里有帮助,但是您可以用游客设计模式来模仿它:
public class Test {
public static interface Visitable {
void accept(Visitor visitor);
}
public static class A implements Visitable {
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
}
public static class B implements Visitable {
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
}
public static interface Visitor {
void visit(A a);
void visit(B b);
}
public static class PrintingVisitor implements Visitor {
@Override
public void visit(A a) {
System.out.println("A");
}
@Override
public void visit(B b) {
System.out.println("B");
}
}
public static void main(String[] args) {
Visitable visitable = new A();
m(visitable);
visitable = new B();
m(visitable);
}
public static void m(Visitable visitable) {
visitable.accept(new PrintingVisitor());
}
}https://stackoverflow.com/questions/29795607
复制相似问题