集合引用变量

时间:2019-03-06 10:26:05

标签: java set treeset

对于代码:

Set<Phone> set = new TreeSet<>();
set.add(new Phone("Harry"));

我收到错误消息:

  

电话无法转换为java.base / java.lang.Comparable

如果引用变量的类型为Set,为什么Phone必须实现Comparable?

如果引用变量为TreeSet,则当然Phone类必须实现Comparable

3 个答案:

答案 0 :(得分:4)

看看Javadoc for TreeSet()

  

构造一个新的空树集,并根据其元素的自然顺序对其进行排序。 插入到集合中的所有元素必须实现Comparable接口。

元素必须具有可比性,因为TreeSetSortedSet。请注意,Set不一定是无序的,只是Set接口没有指定顺序。允许实现类定义元素的顺序。

如果要将非可比较实例插入比较器中(或使用非自然顺序),则必须使用显式比较器调用构造函数。

Set <Phone> set = new TreeSet<>(someComparator);

答案 1 :(得分:1)

尽管引用类型为Set,但实际实现仍为TreeSet,因此调用了TreeSet.add()方法。当调用ThreeSet.add()并获得异常时,参数检查会在运行时发生:

Exception in thread "main" java.lang.ClassCastException: 
    class java.lang.Object cannot be cast to class java.lang.Comparable

答案 2 :(得分:1)

仅实际类型重要。这是一个基于TreeSet的{​​{1}},它与TreeMap一起使用,除非指定了另一个比较器。

例如,您可以基于Comparable属性来定义比较器。这样就无需为Phone实现Comparable

Phone