能够转换ArrayList <set <string>&gt; to ArrayList <string>没有类强制转换异常的字符串</string> </set <string>

时间:2013-03-12 06:30:21

标签: java casting

我正在进行以下操作。

    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);

提供以下输出 [[s2,s1]]
[[s2,s1]]

不应该在第一种情况下给出类强制转换异常吗?

谢谢,
山塔努

2 个答案:

答案 0 :(得分:2)

泛型是java语言的编译时功能所以在你运行时的代码中你正在做的是将它转换为ArrayList所以最终它是ArrayList所以没有执行。

此外,您的代码不会对返回的'ArrayList'执行任何操作,只会打印调用toString()方法的代码,因此您的代码目前无法拥有ClassCastExpection

答案 1 :(得分:0)

您为ob1ob2提供的类型参数在运行时不存在。 println方法不会带有实际类型,因为它只是调用Object#toString方法。除非您尝试将存储在数组列表中的对象直接用作不正确的类型,否则不会得到ClassCastException

例如,如果您执行以下操作,则会出现异常。

String s = ob.iterator.next();