2014-11-15 42 views
0

因此,假設我有2類:任何方式來指定擴展多個類中的任何一個的Java泛型類型變量?

public class A 
{ 
    public void 
    f() 
    { 
    } 
} 

public class B 
{ 
    public void 
    f() 
    { 
    } 
} 

我想編寫,可以調用F的通用靜態方法時,通過一個實例或B.我想:

public class C 
{ 
    public static <T extends A & B> void 
    g(T t) 
    { 
    t.f(); 
    } 

    public static void main(String[] args) 
    { 
    A a = new A(); 

    g(a); 
    } 
} 

但編譯器聲明A不是「T擴展A & B」的有效替代品,我認爲這是因爲T必須擴展B和A,而B顯然A不。我找不到指定「T擴展A或B」之類的方法。這樣的事情是不可實現的嗎?我是一名java初學者,所以對此的任何幫助將不勝感激。

回答

1

您只能指定一個通用類型。 改爲使用接口。

一個接口指定了一組特定的方法,它的每個成員都必須有。一個類可以實現多個接口。

在你的榜樣,我會定義一個接口與方法f()

public interface MyInterface { 
    void f(); 
} 

AB實現接口:

public class A implements MyInterface 
{ 
    @Override 
    public void f() { 
    // ... 
    } 
} 
public class B implements MyInterface 
{ 
    @Override 
    public void f() { 
    // ... 
    } 
} 

然後,你可以指定接口類型您的方法的論點:

public static void g(MyInterface obj) 
{ 
    obj.f(); 
} 

有關接口的更多詳細信息,請查閱Java文檔:What Is an Interface?

+0

感謝您的輸入。我想我應該更精確一點 - 我正在尋找使用泛型靜態方法的第三方類,我不能修改。這些類沒有可用的通用接口,但出於某種原因,它們都實現了相同的功能。我試圖將當前需要爲每個類重載的重複性方法編碼合併到一個方法中。 –

+0

我也意識到我可以通過在一個類中包裝第三方類實現這一點,實現常用的方法,並簡單地委託給第三方類方法,但我希望通過巧妙地使用泛型來避免這種笨拙:) –

+0

@ MistahMikey你可以使用反射:'clazz.getMethod(「f」)。invoke(obj)'。 – Frithjof

相關問題