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)
      ,而是符合pick
      m2(对象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
      )。我将编辑我的问题。它部分地解决了这个问题。非常感谢。