2013-03-12 71 views
0

我正在做以下操作。能夠將ArrayList <Set<String>>拋到ArrayList <String>沒有類拋出異常的字符串

Set<Set<String>> set1 = new HashSet<Set<String>>(); 
    Set<Set<String>> set2 = new HashSet<Set<String>>(); 

    set1.add(new HashSet<String>(Arrays.asList("s1","s2"))); 
    set1.add(new HashSet<String>(Arrays.asList("s4","s5"))); 

    set2.add(new HashSet<String>(Arrays.asList("s5","s4"))); 


    ArrayList<String> ob = (ArrayList<String>)CollectionUtils.subtract(set1, set2); 
    ArrayList<Set<String>> ob1 = (ArrayList<Set<String>>)CollectionUtils.subtract(set1, set2); 
    System.out.println(ob); 
    System.out.println(ob1); 

它給出以下輸出。
[S1,S2]
[S1,S2]

難道不應該給在第一種情況下的類轉換異常?

感謝,
山塔努

+0

你的編譯器應該是給你一個警告,這是一個未經檢查的投(即,不能在運行時執行,因此可能會導致以後的'ClassCastException'鑄造的地方在那裏有沒有明確的投)。無論哪種方式,您都可以通過[Googling'unchecked cast'](https://www.google.com/search?q=unchecked+cast)找到大量信息(包括大量Stack Overflow問題)。 – ruakh 2013-03-12 06:32:51

+0

嗨Ruakh,這兩種情況都給了我同樣的警告。 – shantanu 2013-03-12 06:35:27

+0

所以,你應該谷歌搜索警告消息。或者,至少*,你應該在你的問題中包含警告信息! – ruakh 2013-03-12 06:37:43

回答

2

泛型是編譯Java語言的時間功能,這樣在你的代碼在運行時,你正在做的是什麼呢鑄造ArrayList所以最終它是一個ArrayList所以沒有execption。

而且您的代碼不會做回「的ArrayList」它只是打印它它調用toString()方法,以便您的代碼目前還沒有方法可行有ClassCastExpection

+0

同意,但在運行時它也是ArrayList >不ArrayList < 字符串> – shantanu 2013-03-12 06:37:03

+0

@shantanu:不,在運行時它只是一個數組列表。 – fdreger 2013-03-12 06:39:05

+3

@shantanu在運行時它唯一的'ArrayList'沒有什麼叫'ArrayList >'現在如果你正在談論列表的內容,那麼當你嘗試在'ArrayList'內部轉換元素時會導致問題。 – 2013-03-12 06:39:53

0

您提供爲ob1ob2不是類型變量什麼在運行時呈現。 println方法不包含實際類型,因爲它只是調用Object#toString方法。除非您試圖直接使用存儲在數組列表中的對象作爲不正確的類型,否則不會得到ClassCastException

例如,如果您執行了以下操作,則會發生異常。

String s = ob.iterator.next(); 
相關問題