在Java

时间:2017-06-30 08:54:59

标签: java generics methods

有两个类A和B有类似的方法。如何编写一个泛型方法,该方法将类对象中的任何一个作为参数,并且能够调用该类的方法。

编辑:我无法控制A,B类。我只将它们作为参数。所以我无法修改添加它们。

public class methods {

    public static void main(String[] args) {
        new methods().getName(new B());
        new methods().getName(new A());
    }

    private <T> void getName(T obj){
        // obj.getName()
    }
}

class A {

    String name = "ClassA";

    public void getName(){
        System.out.println(name);
    }

}

class B {

    String name = "ClassB";

    public void getName(){
        System.out.println(name);
    }

}

2 个答案:

答案 0 :(得分:2)

如果这两个类没有实现公共接口,则可以使用反射,但这不是类型安全的(如果A或B不再支持getName()并且反射很多,则不会出现任何编译错误比直接调用方法慢。

您还可以实现两个共享接口的适配器并使用它们(使用泛型):

interface Wrapper {
    String getName();
}

class WrapperA implements Wrapper {
    final private A a;
    public WrapperA(A wrapped) {
        this.a = wrapped;
    }
    @Override public String getName() {
        return a.getName();
    }
}

答案 1 :(得分:1)

以下解决方案使用通用方法中的instanceof operator来达到您的输出。

   public static void main(String[] args){
        new methods().getName(new B());
        new methods().getName(new A());
    }

    private <T> void getName(T obj) {
        if(obj instanceof B){
            ((B) obj).getName();
        }
        else{
            ((A) obj).getName();
        }
    }