Java泛型方法 - 如何使其调用专用方法

Mar*_*ski 2 java generics

Java中的泛型方法是否可以根据输入的类型调用特定的其他方法?

我尝试了以下示例,希望能够代表问题.

class X {
  public void pr(Object s) {
      System.out.println("Object");
  }

  public void pr(String s) {
      System.out.println("String");
  }

  public <T> void go(T x) {
      this.pr(x);
  }

  public static void main(String[] args) {
    String v = "hello";
    X x = new X();

    // Both print "Object", while I want "String"
    x.go(v);
    x.<String>go(v);
  }
}
Run Code Online (Sandbox Code Playgroud)

我希望go()调用pr(String).但无论我做什么,都会调用pr(Object).

以上示例仅供演示,实际应用要复杂得多.

提前致谢.

Psh*_*emo 5

不幸的是,由于类型擦除,你所描述的是不可能的,因此在运行时T被视为Object如此pr(Object)选择.

一种可能的解决方案是手动测试传递数据的类型并调用正确的方法,几乎​​没有像铸造一样的帮助

public <T> void go(T x) {
    if (x instanceof String)
        pr((String)x);
    else
        pr(x);
}
Run Code Online (Sandbox Code Playgroud)

但是,如果您可以编辑类的代码,您将传递给go方法,那么首选解决方案是pr在每个类中添加/实现方法,以便您可以使用多态来调用它们:

interface CanPR{
    void pr();
}

class Foo implements CanPR{
    @Override
    public void pr() {
        System.out.println("pr from Foo");
    }
}

class Bar implements CanPR{
    @Override
    public void pr() {
        System.out.println("pr from Bar");
    }
}


class X {

    public <T extends CanPR> void go(T x) {
        x.pr();
    }

    public static void main(String[] args) {
        CanPR a = new Foo();
        CanPR b = new Bar();

        X x = new X();

        x.go(a); //prints: pr from Foo
        x.go(b); //prints: pr from Bar
    }
}
Run Code Online (Sandbox Code Playgroud)

实际上在这种情况下你甚至不需要泛型类型,go所以你可以重写它

    public void go(CanPR x) {
        x.pr();
    }
Run Code Online (Sandbox Code Playgroud)