Java Collections.sort()引发泛型列表的编译时错误
为什么这段代码会抛出编译时错误Java Collections.sort()引发泛型列表的编译时错误,java,Java,为什么这段代码会抛出编译时错误 interface Pair<K, V> extends Comparable<OrderedPair<K, V>> { K getKey(); V getValue(); } class OrderedPair<K, V> implements Pair<K, V> { private K k; private V v; public OrderedPa
interface Pair<K, V> extends Comparable<OrderedPair<K, V>> {
K getKey();
V getValue();
}
class OrderedPair<K, V> implements Pair<K, V> {
private K k;
private V v;
public OrderedPair(K k, V v) {
this.k = k;
this.v = v;
}
@Override
public K getKey() {
return k;
}
@Override
public V getValue() {
return v;
}
@Override
public int compareTo(OrderedPair o) {
return this.getKey().toString().compareTo(o.getKey().toString());
}
}
public class Operation {
public static void main(String[] args) {
List<Pair<String, String>> list = new ArrayList() {{
add(new OrderedPair("BCA", "29"));
add(new OrderedPair("CAB", "31"));
add(new OrderedPair("ABC", "30"));
}};
Collections.sort(list); // showing compile time error
}
}
接口对扩展{
K getKey();
V getValue();
}
类OrderedPair实现了Pair{
私人K,;
私人V V;
公共有序对(K,V){
这个。k=k;
这个,v=v;
}
@凌驾
公共K getKey(){
返回k;
}
@凌驾
public V getValue(){
返回v;
}
@凌驾
公共整数比较对象(OrderedPair o){
返回这个.getKey().toString().compareTo(o.getKey().toString());
}
}
公营课运作{
公共静态void main(字符串[]args){
列表=新的ArrayList(){{
添加(新订单对(“BCA”、“29”);
添加(新订单对(“CAB”、“31”);
添加(新订单对(“ABC”、“30”);
}};
Collections.sort(list);//显示编译时错误
}
}
据我所知,您正在尝试实现一个数据结构对
,您希望将其存储在列表中,然后使用集合进行排序。根据对
的键进行排序
代码中的问题是您使用的是集合。sort
接受列表
其中T扩展可比性编辑后,您的代码就是错误的-我猜类型是由于
而被删除的,所以忽略我之前的评论。您当前的代码表示对
只能与有序对
进行比较,因此当您给排序
一个列表
时,它不知道如何处理它们。不需要抽象类
-使用默认
方法。您还没有修复示例代码中的rawtypes。是的,我们也可以在接口中使用默认方法。但是,因为我们试图在这里建立一个数据结构。我认为最好有一个抽象类。解决原始类型不是问题的一部分。我想做最少的修改以使答案更容易理解。一方面,您将OPs接口
更改为抽象类
,另一方面,您没有修复明显的错误,因为您不想更改内容?
abstract class Pair<K, V> implements Comparable<Pair> {
abstract K getKey();
abstract V getValue();
@Override
public int compareTo(Pair o) {
return this.getKey().toString().compareTo(o.getKey().toString());
}
}
class OrderedPair<K, V> extends Pair<K, V> {
private K k;
private V v;
public OrderedPair(K k, V v) {
this.k = k;
this.v = v;
}
@Override
public K getKey() {
return k;
}
@Override
public V getValue() {
return v;
}
}
class Operation {
public static void main(String[] args) {
List<Pair<String, String>> list = new ArrayList() {{
add(new OrderedPair("BCA", "29"));
add(new OrderedPair("CAB", "31"));
add(new OrderedPair("ABC", "30"));
}};
Collections.sort(list); // showing compile time error
}
}