Set引用变量中的TreeSet实例

问题描述 投票:5回答:3

对于代码:

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

我收到错误:

手机无法转换为java.base / java.lang.Comparable

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

如果参考变量是TreeSet,那么当然,类Phone必须实现Comparable

java set treeset
3个回答
4
投票

看看Javadoc for TreeSet()

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

元素必须在某种程度上可比,因为TreeSetSortedSet。请注意,Sets不一定是无序的,只是Set接口没有指定顺序。允许实现类来定义元素的排序。

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

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

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

1
投票

实际类型才重要。这是一个TreeSet,它基于TreeMap,与Comparables一起工作,除非指定另一个比较器。

例如,您可以在Phone属性上定义比较器。这将消除为Comparable实施Phone的需要。

Set<Phone> set = new TreeSet<>(Comparator.comparing(Phone::getModel));
© www.soinside.com 2019 - 2024. All rights reserved.