2013-02-09 76 views
0

我只是想知道可以重用一個泛型變量。例如,如果我有一個泛型類保存提供給它的數據庫模型:泛型變量可以重用嗎?

DataManager<ModelObject1> manager = new DataManager<ModelObject1>(); 
ModelObject1 object = new ModelObject1(); 
object.setSomeProperty(); 
manager.save(object); 

難道我然後再用同樣的對象保存不同類型的模型,而無需創建一個新的通用變量。我怎麼能這樣做:

manager = null; 
manager = new DataManager<ModelObject2>(); 
ModelObject2 object2 = new ModelObject2(); 
object2.setSomeProperty(); 
manager.save(object2); 
+6

哦,而不是「物」,你的意思是「變量」。不,變量具有唯一的類型,並且泛型類的參數是類型的一部分。 – luqui 2013-02-09 23:58:08

+2

爲什麼要麻煩?你不會真的以任何方式保存任何內存或任何東西。重用這樣的參考沒有任何好處。 – 2013-02-10 00:42:55

回答

2

由於類型擦除,一個DataManager<ModelObject1>()實際上是一模一樣作爲DataManager<ModelObject2>()在創建時間,從這個角度看沒有理由爲什麼它不應該被重用 - 正確的鑄造之後。

但是,有一些注意事項。如果修改了對象包含的東西的引用是特定的定義類,然後事情就變得複雜:

喜歡的東西,這將意味着你不能再使用安全的目標:

DataManager<ModelObject1> manager = new DataManager<ModelObject1>(); 
manager.setObject(new ModelObject1()); 

我會然而,如果沒有很好的理由,強烈反對。也許如果創建經理是一個非常繁重的過程,你可以證明重複使用它們是合理的。

此代碼編譯好,但我會stongly建議投之前ss.clear()或之後is.clear()否則你會最終有一個Set<integer>含有String

public static void main(String[] args) { 
    Set<String> ss = new HashSet<String>(); 
    ss.add("Hello"); 
    Set<Integer> is = unsecureCast(ss); 
} 

static Set<Integer> unsecureCast(Set s) { 
    return (Set<Integer>) s; 
} 
+0

我不確定爲什麼這個答案被接受,因爲它與OP詢問的完全相反。這是指將相同的實例分配給不兼容的泛型的不同引用(壞主意)。 OP詢問如何將一個不兼容的泛型類型的新實例分配給同一個引用(這也是一個壞主意並且毫無意義)。 – 2013-02-10 05:07:05

+0

@PaulBellora - 我想我在某種程度上同意你的意見。但是,如果您直到(但不包括)讀取問題*我該如何做這樣的事情:...... *當我回答時,問題的表現方式如何,您可能會發現我實際上回答了OP最初意味着的問題問,即*我可以重複使用相同的對象來保存不同類型的模型?* – OldCurmudgeon 2013-02-10 15:07:55

+0

嗯,也許你是對的。我想知道我在這個問題上的錯誤是否是故意的。其他人似乎也有類似的困惑,並將「對象」編輯爲「可變」。 – 2013-02-10 15:46:46

3

這不會編譯。您不能將DataManager<ModelObject2>分配給類型爲DataManager<ModelObject1>的變量,因爲它們不是同一類型。

相關問題