2

这听起来像是轮子的再发明,但我正在尝试实现一个地图,(如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;
    }
}

关于为什么会出现该错误的任何想法?根据创建类时使用的类型变量,我可以没有通用返回类型吗?还是我必须做其他事情才能达到预期的效果?

如果这个问题已经被问过,谢谢并道歉

卡杰坦

4

4 回答 4

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如何处理它?:)

于 2012-06-27T11:45:26.340 回答
2

编译器告诉你这K可能不是一个有顺序的类型。您应该将类​​声明为

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

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

于 2012-06-27T11:43:28.327 回答
0

嗯......你应该提供一个比较器或实现你的 K(无论它可能是)类可比较的

在实现可比较的情况下,还要声明这样的类参数以将其限制为仅包含可比较的对象。

public class Map<K extends Comparable<K>, V> 
于 2012-06-27T11:42:43.613 回答
0

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

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

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

于 2012-06-27T11:43:01.547 回答