我正在使用javafx对类并尝试使用第二个值对它们进行排序。
public static void main(String[] args)
{
List<Pair<Integer, Integer>> dist = new ArrayList<Pair<Integer, Integer>>();
dist.add(new Pair <Integer,Integer> (4,54));
dist.add(new Pair <Integer,Integer> (6,94));
dist.add(new Pair <Integer,Integer> (7,4));
dist.add(new Pair <Integer,Integer> (11,9));
Collections.sort(dist, new ListComparator<>());
System.out.println(dist);
}
public class ListComparator implements Comparator {
@Override
public int compare(Pair<Integer, Integer> o1, Pair<Integer, Integer> o2) {
return o1.getValue() - o2.getValue();
}
}
我一直收到以下错误和警告。
/tmp/java_izg9ZN/Main.java:34
:错误:无法推断类型参数ListComparator
Collections.sort(dist, new ListComparator<>());
原因:不能将“<>
”用于非泛型类ListComparator
中
/tmp/java_izg9ZN/ListComparator.java:21
:错误:ListComparator
不 抽象并且不会覆盖抽象方法compare(Object,Object)
在Comparator
public class ListComparator implements Comparator {
/tmp/java_izg9ZN/ListComparator.java:23
:错误:方法不 覆盖或从超类型实现方法@Override
我不知道我做错了什么,因为我看到这样做的例子完全相同,所以我真的不知道我做错了什么。请帮忙!感谢
答案 0 :(得分:4)
您的代码有两个问题。首先你打电话:
Collections.sort(dist, new ListComparator<>());
因此,您告诉Java使用ListComparator
自己推断类型(菱形运算符<>
)。
但是,您的ListComparator
课程不是通用的。它不期望任何类型的参数,例如String
,你不写String<...>
。
您可以通过ListComparator
泛型来处理此问题,例如List
的元素:
public class ListComparator<E> implements Comparator<E> {
// Compare E elements ...
}
但是,您似乎想要一个非泛型 ListComparator
,它固定为比较Pair<Integer, Integer>
元素。在这种情况下,删除钻石操作符:
Collections.sort(dist, new ListComparator());
第二个问题是你对Comparator
使用原型,而不是告诉他将要比较的对象的类型。
因此,编译器在阅读@Override
时期望您的compareTo
方法与Comparator
中写的签名相匹配:
public int compareTo(Object o1, Object o2)
而不是
public int compareTo(Pair<Integer, Integer> o1, Pair<Integer, Integer> o2)
您可以通过明确告知Comparator
使用什么而不是使用原始类型来解决此问题:
public class ListComparator implements Comparator<Pair<Integer, Integer>> {
// Compare Pair<Integer, Integer> elements ...
}