![](/img/trans.png)
[英]Why calling method with generic return on a generic class is considered unsafe by javac?
[英]Javac error on Generic return type
听起来好像是对wheel的重新发明,但是我正在尝试实现地图(例如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
看一下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)
的调用将按预期成功。
如果没有对通用参数的限制,那么有人可以创建一个键类型像Exception
这样不可比的Map
,那么您如何期望差劲的Collections.sort
来处理呢? :)
编译器告诉您K
可能不是带顺序的类型。 您应该将该类声明为
public class Map<K extends Comparable<K>, V> {
以确保可以将K
值与其他K
值进行比较。
好吧...您应该提供一个比较器或实现与您的K(无论是哪种)类相当的实现。
在实现可比对象的情况下,还应像这样声明类参数以将其限制为仅包含可比对象。
public class Map<K extends Comparable<K>, V>
在Javadoc中, Collection.sort()的类型必须为
public static <T extends Comparable<? super T>> void sort(List<T> list)
换句话说,必须将K
声明为Comparable<K>
或Comparable<? super K>
Comparable<? super K>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.