2013-03-08 13 views
17

讓我們說我有以下類別:添加到一套通用的傳遞給方法

  • 動物

動物是基礎類,貓,狗和牛每個子類。

我現在有一個Set<Cat>Set<Dog>Set<Cow>每一種以相同的方式被使用,因此是很有意義做一個泛型函數來對它們進行操作:

private boolean addObject(Animal toAdd, Animal defVal, Set<? extends Animal> vals) 

這個偉大的工程,我能自由通過我的套裝沒有問題。

問題出現:我無法嘗試添加Animal添加到參數值。谷歌搜索顯示,如果我改變閱讀方法:

private boolean addObject(Animal toAdd, Animal defVal, Set<? super Animal> vals) 

我將能夠將動物添加到參數vals。這個工作,除了現在,我不能通過我的子集,我的套貓,狗,和奶牛。進一步的研究告訴我下面的作品,沒有警告啓動:

private <T> boolean addObject(T toAdd, T defVal, Set<? super T> vals) 

的問題是,我需要能夠執行方法調用該動物的都有。

((Animal)toAdd).getAnimalType() 

有沒有解決這個問題的任何辦法,所以我可以保持通用功能,並且不需要鑄造:這是很容易圍繞用一個簡單的投得到?除了在這個例子中設置所有基本類型的集合,動物?

+2

*有沒有一種方法可以在不使用html代碼的情況下使用<>?* =>是的,請參閱我的編輯。你很少需要在SO上使用html。 – assylias 2013-03-08 11:57:25

+2

+1對於您以前的研究。不幸的是,在這個網站上這是一件罕見的事情。 – 2013-03-08 11:59:06

+0

@assylias謝謝你。現在,如果我只記得下次我需要提問時。 – Legowaffles 2013-03-08 12:05:07

回答

13

良好的研究,你幾乎在那裏。你只需要添加一個上限到T

private <T extends Animal> boolean addObject(T toAdd, T defVal, Set<? super T> vals) 
+1

謝謝,這個工程。如果可能的話,我會在8分鐘內將其標記爲答案。 – Legowaffles 2013-03-08 12:01:42

+0

說明這種方法簽名的含義可能很有用。它的意思是:「給定某種類型的'T',它可以是'Animal'或'Animal'的子類(比如'Cat'),這個方法有兩個'T'類型的參數和''' (如'Set ')或某種超類型爲'T'的類型(例如'Set ')。「省略'?來自'Set'參數的super'仍然允許這個工作,而不是'Set '。但是'Set <?擴展動物>'不起作用,因爲'<?擴展動物>'意味着「某種類型是」動物「或」動物「的一個子類*,但我不知道哪個子類*。 – 2013-03-09 05:51:22

相關問題