这可能听起来像轮子的重新发明,但我正在尝试实施地图,(如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
答案 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>