2010-12-07 51 views
1

不同的接口我有兩個類(A和B)使用相同的方法(富):的Java:在泛型

public class A { 
public String foo() { 
    return "A said foo"; 
} 
} 

public class B { 
public String foo() { 
    return "B said foo"; 
} 
} 

我想使通用類,可以調用此方法。但我有兩個想法如何做到這一點的運行時間和有關於編譯時沒有想法:

  1. 檢查類型和轉換爲A或B.

  2. Get方法。

我的普通例子調用getMethod:

public class Template<T> { 
private T mT; 

public Template(T t) { 
    mT = t; 
} 

    public String bar() { 
    String result = "no result"; 
    try { 
     Method m = mT.getClass().getMethod("foo", null); 
    result = (String)m.invoke(mT); 
    } catch (Exception e) { 
    result = e.toString(); 
    e.printStackTrace(); 
    } 
    return result; 
    } 
} 

是否有另一種方式該怎麼辦呢? 我期待這樣的事情:

public class Template<T extends A | B> { 
... 
} 

請注意,我不是等級「A」和「B」的創造者。

回答

5

你必須讓這兩個類實現一個公共接口聲明foo方法。 Java不支持所謂的「鴨子打字」,這在這裏很有幫助。

+0

確實。沒有接口(或超類),只有*方法才能通過反射,泛型或否。 – 2010-12-07 09:14:09

0

您可能只需將ABAbstract作爲A和B的父類型即可。 然後,您可以使用此類作爲參數,或者保留通配符泛型並將其轉換爲ABAbstract。 你也可以讓A和B類都實現一個聲明foo方法的接口。這可能是最簡單的方法,使您的編譯不會拋出任何錯誤,並完全符合您所說的「您正在尋找的東西」。

但我THINKY OU必須寫:

public class Template<T extends ABInterface> { 

,但我不肯定不清楚了。 它也可以在類中使用關鍵字實現。

4

您將不得不創建一個接口並讓您的模板接受任何實現該接口的類。

interface Foo{ 
    public String foo(); 
} 

public class A implements Foo { 
    public String foo() { 
     return "A said foo"; 
    } 
} 

public class B implements Foo{ 
    public String foo() { 
     return "B said foo"; 
    } 
} 

public class Template<T extends Foo> { 
    private T mT; 

    public Template(T t) { 
     mT = t; 
    } 
    public String bar() { 
     return mT.foo(); 
    } 
} 
+0

我不是A和B班的創作者。 – Vlad 2010-12-08 16:12:31