2016-10-28 32 views
0

我正在鑄造列表<T>至列表<字符串>。列表的任何元素上的getClass()方法返回List的元素的實際類,即T而不是String。不應該Java返回字符串而不是實際的類,因爲列表被轉換爲字符串列表?鑄造列表<T>至列表<String>類型

public cast (List<?> unsortedList) { 
    List<String> unsortedListOfPrimitives = (List<String>)unsortedList; 
    System.out.println(unsortedListOfPrimitives.get(0).getClass()); 
} 


cast(List<BigDecimal> unsortedList); 

Output : java.math.BigDecimal 
+1

與C++不同,Casting不會改變Java中的對象。你只是告訴Java T類型是「String」。如果你有'列表 aList =新列表()'和後面的''列表 sList =(列表)aList;','sList'是同一個對象,你剛纔的類型是錯誤的。 –

+0

如果你舉了一個具體的例子,它會有所幫助。 –

+0

謝謝,托馬斯。我編輯了這個問題來包含一個例子。 –

回答

1

Java泛型並不總是按照您期望的方式工作。

具體而言,將泛型轉換爲特定類型實際上並不會改變對象,並且在執行此操作時可能會得到不安全的結果,並且不能100%確定您擁有正確的結果。

因此,您投到List<String>的對象實際上仍然是包含BigDecimal條目的列表,您剛剛對它進行了誤操作。

這是Java是類型不安全的情況下 - 就像投ObjectInteger是類型不安全的(但在運行時,不安全ObjectInteger強制轉換將失敗的施法時間,而一般的強制轉換不會直到後來才失敗。)

+0

如果忽略編譯時警告只是不安全的。 – shmosel