2012-09-05 66 views
3

我有兩個接口。一個接口A和一個接口B,擴展了接口A.現在,我有一個喜歡保持對象的引用的類,它實現了A或B.我想爲它提供setter。我在下面嘗試,但得到類型錯誤匹配例外。Java界面 - 泛型

public interface A { 
} 

public interface B extends A { 
} 

public class AB { 
private Class<? extends A> object; 

public void setObject(Class<? extends A> o){ 
    this.object = o; 
} 
} 

所以基本上,我想setObject方法接受,要麼實現接口A或B.

+1

只需將其輸入爲'A':setObject(A a)' –

+0

@Jordão設置該答案作爲答案,幷包含一個鏈接,說明爲什麼對我的+1有效(多態)。 – pickypg

+0

@pickypg:完成。 –

回答

4

答案很簡單對象:

類型作爲AsetObject(A a)

實現B一類也實現A。全碼:

public class UsesA { 
    private A a; 

    public void setObject(A a){ 
    this.a = a; 
    } 
} 

現在,如果你真的想與B工作,您可以輸入它作爲B,這也將讓你把它當作一個A,因爲從中B繼承:

public class UsesB { 
    private B b; // can call A's methods on this field 

    public void setObject(B b) { 
    this.b = b; 
    } 
} 

但現在你可以在A(靜態)引用不傳遞給setObject。如果你真的想這樣做,那麼你需要首先將它作爲B下載它,這可能會在運行時失敗。泛型不會改進。

+1

[多態](http://en.wikipedia。org/wiki/Polymorphism_in_object-oriented_programming)是一件很棒的事情 – pickypg

+0

@pickypg:確實! –

+0

@Jordao:謝謝你的回答。但如果將來,接口B增加了新的方法。在這種情況下,我將不得不上演它,不是嗎? –

2

如果你有實現B一個對象,它也將是A一個實例。正因爲如此,你可以讓setObject接受任何A,這將允許AB實例被傳遞給它。

public void setObject(A a){ 
    this.object = a; 
} 
0

如前所述,如果您將使用(A)它將工作,因爲B是A類型。因此,子類可以始終表示它的父類。

2

您的代碼實際上並不符合您的問題。你說,

我有類喜歡保持要麼 實現A或B

但是場(稱爲object)對象的引用實際上是一類,而不是一個對象(一個類的實例)。

你的代碼工作如果你真正想擁有你的二傳手接受擴展A.任何接口,但正如你可能從其他答案現在意識到,你真正想要的:)

public class AB { 
    private Class<? extends A> type; // renamed from object for clarity 

    public void setObject(Class<? extends A> type) { 
     this.type = type; 
    } 

    @Test 
    public void testSetter() { 
     setObject(A.class); // no errors 
     setObject(B.class); // no errors 
    } 
} 
實例