通用返回类型的Javac错误

时间:2012-06-27 11:39:18

标签: java generics

这可能听起来像轮子的重新发明,但我正在尝试实施地图,(如Map<K,V>)。该类有一个名为sortedKey()的函数,它返回ArrayList<K>我的代码的简化版本如下。我已经尝试将内联调试作为注释。

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;
    }
}

为什么会出现错误?我可以不具有泛型返回类型,具体取决于创建类时使用的类型变量吗?或者我是否必须做其他事情以达到预期的效果?

如果已经提出这个问题,感谢并道歉

接cajetan

4 个答案:

答案 0 :(得分:3)

查看Collections.sort的签名:

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

所以错误,虽然可能令人困惑,但是 - 你不能在任意类型的列表上调用sort;元素类型必须实现Comparable。

如果您将通用参数限制为可比较,例如:

public class Map<K extends Comparable<K>,V> {
    ...

然后对Collections.sort(ret)的调用将按预期成功。

如果没有对通用参数的限制,有人可以创建一个Map,其密钥类型与Exception不可比较 - 那么您如何期望差Collections.sort来处理它? :)

答案 1 :(得分:2)

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

public class Map<K extends Comparable<K>, V> {

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

答案 2 :(得分:0)

嗯......你应该提供一个比较器或者用你的K(无论哪个)来实现可比较

在实现可比较的情况下,同样声明类参数,以限制它只包含可比较的对象。

public class Map<K extends Comparable<K>, V> 

答案 3 :(得分:0)

Collection.sort()的Javadoc开始,类型必须是

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

换句话说,K必须声明为Comparable<K>Comparable<? super K>