2017-06-30 64 views
0

有兩個類A和B有類似的方法。如何編寫一個泛型方法,該方法將任何一個類對象作爲參數,並能夠調用該類的方法。Java中帶有對象作爲參數的通用方法

編輯:我無法控制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); 
    } 

} 
+1

編程到接口。 –

+5

使A和B實現一個通用接口,並將該接口用作方法的參數。這只是多態。你不需要那種泛型。 –

+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(); 
    } 
} 
+0

是的,這將是方式.. –

+2

這種模式被命名爲「適配器模式」。 –

+0

@JBNizet相應更新,謝謝! –

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(); 
     } 
    } 
相關問題