2011-05-23 53 views
18

有沒有一種方法來指定通用模板的默認類型?Java:如何在SomeClass中設置「T」的默認值<T>?

比方說,我有一個Monkey類。猴子可以住在不同的Environment S,如JungleZoo

 
    public class Monkey<T extends Environment> 
    { 
     T home; 
     ... 

     public T getHome() 
     { 
      return home; 
     } 
    } 

是否有指定T默認的方式,這樣我就可以使用類型Monkey而不是Monkey<?>沒有得到一個編譯器警告?

編輯

換句話說,有沒有擺脫「原料型」的警告,而無需顯式地壓制它的方法嗎?

+0

是的,我想「原始類型」是默認的。唯一的問題是警告。 – Tom 2012-05-18 17:12:23

+0

有人可以檢查這個答案是否正確? http://stackoverflow.com/questions/40466553/extending-arraylist-with-determined-default-member-type – 1412 2016-11-07 14:59:50

回答

20

不,你不能那樣做。通用參數沒有默認值。您可以重新組織您的類型層次結構,以便使GenericMonkey和DefaultMonkey將泛型參數設置爲所需的默認值。

4

,你不行: http://en.wikipedia.org/wiki/Comparison_of_Java_and_C%2B%2B

泛型類型參數不能有默認參數。

什麼使這樣的:

public class Monkey extends Monkey<YourType> 

Obviusly你 「廢」 爲繼承的能力。

編輯1: 另一個有趣的事情是做什麼,我建議相反,

public class Monkey<T> extends Monkey 

在這種情況下,所有的泛型類猴子繼承猴,在某些情況下,這是一個非常有趣的事情(特別是當你注意到一些實例方法適用於所有類而不需要泛型)。這種方法在Castle ActiveRecord中使用(我已經看到它在C#中使用,而不是在Java中),並且我覺得它很漂亮。

+1

這兩個都必須在不同的文件中(我認爲這是因爲在java中只能有一個公共類每個文件)?在這種情況下,你選擇什麼名字(因爲其中一個是Monkey 和其他MOnkey。 – 2011-09-30 19:44:57

+0

這真的不是我真正想到的問題,但是你可以命名只包含Monkey的文件(沒有泛型參數)「Monkey」。通用猴子MonkeyGeneric或Monkey_T_如你所願 – 2011-09-30 21:56:09

+1

是不是java文件名應該與公共類的名稱相同?我基本上很好奇你會爲猴子選擇什麼名字如果已經有一個類被稱爲Monkey.java – 2011-09-30 22:27:32

1

爲什麼不直接使用Generic的基類呢? Monkey<Environment>

+0

環境可能是抽象的,我們不知道這個。 – 2011-05-23 19:01:05

+0

它可能,這就是爲什麼我問。但是,不應該泛型類型能夠是一個抽象的,甚至是一個接口? – Zak 2011-05-23 19:06:58

+0

'環境'將永遠是具體的。 – 2011-05-23 20:46:03

1

仁,你的問題沒有把你爲什麼要使用泛型的任何背景。如果您說明了您正在嘗試做什麼以及爲什麼使用泛型,這將非常有幫助。泛型存在於IMHO ,主要是,以避免在將事物放入設計爲類型的通用持有者的集合中並將其取出時無處不在。這個有點意味着對一堆事物的迭代,但不一定。

我的觀點是,我沒有看到你的類或代碼需要能夠創建需要迭代環境的猴類的自定義版本的任何部分。如果情況並非如此,那麼您可能甚至不需要仿製藥。相反,你可能需要依賴注入。猴類應該有一個構造函數來獲取環境。環境是一個接口(或簡單的基類)。該接口有幾個默認操作,如getBathroomLocation()和getFoodLocation()。相反,使用泛型創建一個類型的猴子,生活在動物園中,您後來創建猴子並注入其環境的它生活在依賴。

Monkey monkey = new Monkey(new CostaRicaJungle()); 

,你可以設置這個環境不同的東西。野生猴子被抓獲,而你現在要做

monkey.setEnvironment(new BronxZoo()); 

後來,猴子得到一個生存狀態升級,你做一個

monkey.setEnvironment(new SanDiegoZoo());