2014-06-14 54 views
-1

如果我聲明一個列表「myList」,我碰巧知道它只包含字符串,我可以毫不費力地將它轉換爲列表,實際上在後臺將列表轉換爲一串字符串?泛型如何工作Java

List myList = new ArrayList(); 
List<String> myStringList = (List<String>) myList; 

如果我創建列表作爲對象的名單我會假設同樣適用,但我不能再施放此回字符串列表,究竟是什麼原因呢?

List<Object> myObjList = new ArrayList<Object>(); 
List<String> myStringList = (List<String>) myObjList; // Can't do this! 
+0

如果您添加了示例代碼 – awksp

+0

,它可能會有所幫助記住,泛型應該提供*保證*,表示您的代碼是類型安全的。你的第二個例子不允許類型安全的代碼,所以它是不允許的。第一個代碼示例涉及完全跳過這些檢查的原始類型。 – awksp

回答

0

字符串是對象,但對象不是字符串,這就是爲什麼你不能做第二個代碼。

我喜歡這樣想:狗是一種動物,可以表現爲動物,但動物不是狗。

好信息here

+1

非常像一個正方形是矩形,但矩形不是正方形。 –

+0

可能還想爲第一個片段添加解釋 – awksp

+0

爲什麼以及如何才能做到第一個,然後我可以在那裏擁有一堆整數? – user2248702

0

技術上加入子句通過@FunctionR

Strings are Objects but Objects are not Strings 

但是Objects回答可以是String

Object是一個基類的String。所以你可以在兩個方向上進行投射。

例如,

Object a = null; 
String s = ""; 

a = s; 
s = (String)a; 

String所以可以是Object

但在List<Object>List<String>

你應該與前泛型代碼兼容的原因這樣做

List<Object> myObjList = new ArrayList<Object>(); 
List<String> myStringList = (List) myObjList; 
+2

那麼,更像你*可以*。不過,你真的不應該*。這樣做是要求很多麻煩。 – awksp

+0

是的,如果'ArrayList '包含除String之外的其他對象,則將其轉換爲'List '並訪問它可能導致運行時出現異常。如果'ArrayList '應該只保存「字符串」,那麼應該聲明爲'ArrayList ' –

+0

是的,但問題聽起來只能讓它做到這一點,對。除非您確切地知道類型,否則在任何時候施放「對象」都會給您帶來錯誤。 –

1
List myList = new ArrayList(); 
List<String> myStringList = (List<String>) myList; 

作品。它可以工作,但是如果原始List不僅包含Strings,它會在運行時給您帶來錯誤。

泛型應該在編譯時保護你。他們不允許您將list of Objects轉換爲list of String,因爲List<Objects>可能包含非String的對象,並且會在運行時導致錯誤。