对于代码:
Set<Phone> set = new TreeSet<>();
set.add(new Phone("Harry"));
我收到错误:
手机无法转换为java.base / java.lang.Comparable
如果引用变量是类型Set
,为什么Phone必须实现Comparable?
如果参考变量是TreeSet
,那么当然,类Phone
必须实现Comparable
。
构造一个新的空树集,根据其元素的自然顺序进行排序。插入到集合中的所有元素都必须实现Comparable接口。
元素必须在某种程度上可比,因为TreeSet
是SortedSet
。请注意,Set
s不一定是无序的,只是Set
接口没有指定顺序。允许实现类来定义元素的排序。
如果要将非Comparable实例插入比较器(或使用非自然排序),则必须使用显式比较器调用构造函数。
Set <Phone> set = new TreeSet<>(someComparator);
虽然引用类型是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
实际类型才重要。这是一个TreeSet
,它基于TreeMap
,与Comparable
s一起工作,除非指定另一个比较器。
例如,您可以在Phone
属性上定义比较器。这将消除为Comparable
实施Phone
的需要。
Set<Phone> set = new TreeSet<>(Comparator.comparing(Phone::getModel));