对于代码:
Set<Phone> set = new TreeSet<>();
set.add(new Phone("Harry"));
我收到错误消息:
电话无法转换为java.base / java.lang.Comparable
如果引用变量的类型为Set
,为什么Phone必须实现Comparable?
如果引用变量为TreeSet
,则当然Phone
类必须实现Comparable
。
答案 0 :(得分:4)
构造一个新的空树集,并根据其元素的自然顺序对其进行排序。 插入到集合中的所有元素必须实现Comparable接口。
元素必须具有可比性,因为TreeSet
是SortedSet
。请注意,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