1
Set s = new HashSet();

boolean b[] = new boolean[5];
b[0] = s.add("a");
b[1] = s.add(new Integer(5));
b[2]= s.add("a");
b[3] = s.add(new Object());
b[4] = s.add("4");
for(int i=0;i<b.length;i++){
    System.out.println(b[i]);
}

这给了我预期的输出:-

true
true
false
true
true

但是当我使用 Treeset

Set s = new TreeSet();

它给了我这个例外。

Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
at java.lang.Integer.compareTo(Unknown Source)
at java.util.TreeMap.put(Unknown Source)
at java.util.TreeSet.add(Unknown Source)
at com.sunil.questions.TreeSetExample.main(TreeSetExample.java:15)

我想知道为什么它向我展示了这种行为。

4

4 回答 4

6
  • TreeSet是排序的,它不能排序StringInteger在一起。这就是为什么你得到这个例外。

如果你只是添加相同类型的元素,那么你不会得到异常。

这是泛型出现的地方,如果您希望您的集合是类型安全的,那么您可以将它们声明为Set<String> set = new HashSet<String>()Set<Integer> set = new TreeSet<Integer>();

使用这种方法,编译器本身会阻止你添加整数Set<String>

于 2013-08-23T09:17:58.930 回答
3

这里的祸根不是使用泛型。您正在实例化一组未知对象,并希望 Java 能够正确处理它们。不幸的是,这一次它不能 - 无法进行比较StringInteger至少默认情况下是这样。

使用Set<String> s = new HashSet<String>();Set<String> s = new TreeSet<String>();。然后编译器会告诉您不能将 Integer 添加到集合中,您将被迫将其转换Integer为 aString并且一切都会正常工作。

于 2013-08-23T09:21:40.793 回答
2

使用泛型来实例化您的集合。你有一个HashSet/ ,TreeSet其中包含. 不建议这样做。已排序,因此它将无法排序,并且不会发生隐式转换。如果要排序,请使用interface和。StringIntegerTreeSetStringIntegerComparatorStringInteger

于 2013-08-23T09:31:00.100 回答
1

As we know that TreeSet sort element while adding into it. Here u are adding string and integer at same time in TreeSet so u got error. U can use different tree set for string and integer and then can merge.

于 2013-08-23T10:24:57.853 回答