泛型返回类型上的Javac错误

泛型返回类型上的Javac错误,java,generics,Java,Generics,这听起来像是车轮的重新发明,但我正在尝试实现一个映射(比如map)。该类有一个名为sortedKey()的函数,它返回一个ArrayList下面是我的代码的精简版本。我已将调试内联的尝试作为注释包含在内 import java.util.ArrayList; import java.util.Collections; public class Map<K,V> { private ArrayList<Pair<K,V> > array; //Pair

这听起来像是车轮的重新发明,但我正在尝试实现一个映射(比如
map
)。该类有一个名为
sortedKey()
的函数,它返回一个
ArrayList
下面是我的代码的精简版本。我已将调试内联的尝试作为注释包含在内

import java.util.ArrayList;
import java.util.Collections;

public class Map<K,V> {
    private ArrayList<Pair<K,V> > array; //Pair<K,V> is a class defined in another file.

    //returns an ArrayList(of proper type) of keys (ie, the desired function)
    public ArrayList<K> sortedKeys(){
        ArrayList<K> ret = keys(); //another method defined inside same class

        K s = ""; // error: no suitable method found for sort(ArrayList<K>)
        Collections.sort(new ArrayList<String>()); //Works just fine..
        Collections.sort(ret); //Same error here..
        return ret;
    }
}
import java.util.ArrayList;
导入java.util.Collections;
公共类地图{
private ArrayList array;//Pair是在另一个文件中定义的类。
//返回键(即所需函数)的ArrayList(正确类型)
公共ArrayList sortedKeys(){
ArrayList ret=keys();//在同一类中定义的另一个方法
K s=“”;//错误:未找到适合排序的方法(ArrayList)
Collections.sort(new ArrayList());//工作正常。。
Collections.sort(ret);//此处出现相同错误。。
返回ret;
}
}
你知道为什么会出现这个错误吗?根据创建类时使用的类型变量,是否可以不使用泛型返回类型?还是我必须做些别的事情才能达到预期的效果

如果已经有人问过这个问题,请表示感谢和歉意


Cajetan

嗯……你应该提供一个比较器或者通过你的K(无论是哪个)类实现可比

在实现comparable的情况下,还可以像这样声明类参数,以限制它只包含comparable对象

public class Map<K extends Comparable<K>, V> 
公共类映射
来自Javadoc的类型必须为

public static <T extends Comparable<? super T>> void sort(List<T> list)

publicstatic编译器告诉您,
K
可能不是具有顺序的类型。您应该将该类声明为

public class Map<K extends Comparable<K>, V> {
公共类映射{

为保证
K
值可与其他
K
值进行比较。

查看以下签名:


publicstatic这行的真正意思是说
ks=“”;
?这看起来完全错误,尤其是注释中的错误不匹配(即提到了
排序
调用).没问题。在设计泛型类时,我自己也经常经历类似的步骤-使用无界通配符,直到后来才意识到它只对具有某些基本属性的类才有意义,例如
可序列化的
可比的
可关闭的
,等等。能够通过类型系统以及Javadocs。要获得最佳结果,请使用
K extends Comparable。要获得最佳结果,请使用
K extends Comparable理论上为True,但我从未见过它在实际代码中实际产生差异。要获得最佳结果,请使用
K extends Comparable
public static <T extends Comparable<? super T>> void sort(List<T> list)
public class Map<K extends Comparable<K>,V> {
    ...