2013-11-14 122 views
1

我想創建,超越其他方法簽名,都會有這種類型的簽名的接口:有沒有辦法使用擴展類類型的Java集合?

Set<Instruction> parse(String rawData); 

而且在實現接口的類,我想做爲一個執行時:

Set<Instruction> parse(String rawData){ 
    //Do work. 
    //return an object of type HashSet<DerivedInstruction>. 
} 

其中DerivedInstruction擴展了Instruction抽象類。 (指令也可以是一個接口,或者)。我的觀點不是集合類型(我知道HashSet implements集合),而是泛型類型。 通過搜索它,我發現Set<Instruction>HashSet<SpecificInstruction> 擴展Object類型,並通過繼承(至少不是直接)不相關。因此,我不能在返回類型上上傳HashSet<SpecificInstruction>。任何想法如何做到這一點? 謝謝。

+0

爲什麼不創建類型的對象'的HashSet '呢? – newacct

+0

我可以,我的重點不在於此,而在於泛型。感謝您的關注! :) –

回答

7

這裏有一個例子,你如何可以放鬆你的parse方法的類型約束:

Set<? extends Instruction> parse(String rawData) { 
    //.... 
} 

的完整的例子:

interface Instruction {} 
class DerivedInstruction implements Instruction {} 

Set<? extends Instruction> parse(String rawData){ 
    return new HashSet<DerivedInstruction>(); 
} 
+0

非常好,簡單的解釋和它的作品很大。謝謝! –

1

因此,我不能向上轉型在返回類型的HashSet。關於 的任何想法如何做到這一點?謝謝。

然後你需要使用有界通配符的手段:Set<? extends Instruction>?代表未知類型,其實際上是Instruction的子類型或Instruction類型本身。我們說Instruction是通配符的上界。

Set<? extends Instruction> parse(String rawData){ 
    //Do work. 
    //return an object of type HashSet<DerivedInstruction>. 
} 

閱讀關於這個more here.

+0

謝謝賢者,我希望我可以選擇最好的答案。 –

相關問題