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

    }
}