Java 当数据被比较器接口实现时,为什么编译器抱怨使用不可比较的元素构造排序集合?

Java 当数据被比较器接口实现时,为什么编译器抱怨使用不可比较的元素构造排序集合?,java,android,collections,Java,Android,Collections,我想创建已排序项目的列表,所以我决定使用TreeSet 这是我的密码。它在抱怨用不可比较的元素构造排序集合想知道编译器为什么在抱怨,然后你可以看到Info类正在实现Comparator,但它仍然在抱怨我知道它期望作为构造函数,但我不明白为什么 TreeSet<Info> items = new TreeSet<>() TreeSet items=newtreeset() @AutoValue 公共抽象类信息实现了Comparator{ 公共摘要长毫秒(); 公共抽象字

我想创建已排序项目的列表,所以我决定使用TreeSet 这是我的密码。它在抱怨
用不可比较的元素构造排序集合
想知道编译器为什么在抱怨,然后你可以看到Info类正在实现Comparator,但它仍然在抱怨我知道它期望作为构造函数,但我不明白为什么

TreeSet<Info> items = new TreeSet<>()
TreeSet items=newtreeset()
@AutoValue
公共抽象类信息实现了Comparator{
公共摘要长毫秒();
公共抽象字符串uri();
公共静态信息创建(
长毫秒,字符串uri){
返回新的自动值信息(毫秒,uri);
}
@凌驾
公共整数比较(信息t1,信息t2){
返回。。。。;
}
}

您必须实现
可比
,而不是
比较器
,才能使其工作


Java有两个常用选项来使对象具有可比性。如果可以修改对象,则在大多数标准库类中实现
Compariable
接口。对于不能/不应该修改的对象,可以创建
比较器。然后将比较器对象作为附加信息传入,例如,对于
树集
,有一个接受比较器对象的构造函数。

必须实现
Comparable
,而不是
comparator
,才能工作。但我相信,如果您不想实现Comparable,您也可以将comparator传递到
树集的构造函数中。谢谢,我想知道为什么它不考虑自然排序并要求实现Comparable?错误说明了一切:“使用不可比较的元素”。请添加您的评论作为我的回答vote@I.S因为实现是“自然顺序”的定义,所以javadoc说:这个接口对实现它的每个类的对象施加一个总的顺序。这种排序称为类的自然排序,而类的
compareTo
方法称为其自然比较方法。
@AutoValue
public abstract class Info implements Comparator<Info> {

  public abstract long millisecond();


  public abstract String uri();


  public static Info create(
          long millisecond,  String uri) {
      return new AutoValue_Info(millisecond, uri);
  }

  @Override
  public int compare(Info t1, Info t2) {
      return ....;
  }
}