Java 如何使用泛型调用最具体的方法?
具有以下示例:Java 如何使用泛型调用最具体的方法?,java,type-erasure,generics,Java,Type Erasure,Generics,具有以下示例: 公共类测试{ 公共静态类A{} 公共静态void main(字符串[]args){ A=新的A(); m1(a); } 公共静态空隙m1(T){ //getClass().getSimpleName()是一个 //A的t实例为真 m2(t); } /*不打电话*/ 公共静态空隙m2(A){ 系统输出打印项次(“A”); } 公共静态空隙m2(对象o){ //getClass().getSimpleName()是一个 //A的实例为真 系统输出打印项次(“O”); } } 我不明
公共类测试{
公共静态类A{}
公共静态void main(字符串[]args){
A=新的A();
m1(a);
}
公共静态空隙m1(T){
//getClass().getSimpleName()是一个
//A的t实例为真
m2(t);
}
/*不打电话*/
公共静态空隙m2(A){
系统输出打印项次(“A”);
}
公共静态空隙m2(对象o){
//getClass().getSimpleName()是一个
//A的实例为真
系统输出打印项次(“O”);
}
}
我不明白为什么选择了m2(对象o)
而不是m2(A)
。如您所见,当调用m2(t)
时,t
“是A
”
输出:
- 实际的
O
O O
- 期望
A
A B
m2(A)
编辑: 我希望有一个通用的解决方案,即使我添加了类型
B
(类似于a
)
。。。
公共静态void main(字符串[]args){
A=新的A();
m1(a);
B=新的B();
m1(b);
}
...
公共静态空隙m2(B){
系统输出打印项次(“B”);
}
...
输出:
- 实际的
O
O O
- 期望
A
A B
- 您必须执行以下操作:
public static <T extends A> void m1(T t) {
m2(t);
}
公共静态空隙m1(T){
m2(t);
}
否则,编译器无法推断传递的参数是否符合m2(A)
,而是符合pickm2(对象o)
。您正在查找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());
}
}
你要找的词是。Java泛型不是模板。您在编辑中要求的是不可能的。这解决了特定的问题,但我正在寻找一个更通用的解决方案,允许我添加一个不扩展
a
的B
(类似于a
)。我将编辑我的问题。它部分地解决了这个问题。非常感谢。