假设我有以下类(class)(用于演示目的)
package flourish.lang.data;
public class Toyset implements Comparable<Toyset> {
private Comparable<?>[] trains;
@Override
public int compareTo(Toyset o) {
for (int i =0; i<trains.length; i++) {
if (trains[i].compareTo(o.trains[i]) < 0)
return -1;
}
return 1;
}
}
编译器告诉我
"The method compareTo(capture#1-of ?) in the type
Comparable<capture#1-of ?>
is not applicable for the arguments (Comparable<capture#2-of ?>
)"
我该如何处理我想放置不同的 Comparables
的事实坐火车?
当然,我可以删除参数并使用原始类型,但这似乎有点逃避。
编辑:
也许我给出的例子有点迟钝。我想了解的是泛型是否应该始终与 Comparables
一起使用。例如如果我想要比较的对象的类直到运行时才知道:
public class ComparisonTool {
public static int compareSomeObjects(final Class<? extends Comparable> clazz, final Object o1, final Object o2) {
return clazz.cast(o1).compareTo(clazz.cast(o2));
}
public static void main(String[] args) {
System.out.println(compareSomeObjects(Integer.class, new Integer(22), new Integer(33)));
}
}
如果我替换Comparable
与 Comparable<?>
然后编译器会提示(如上所述),因为不能保证两个强制转换操作是同一个类(capture#1 of ? vs capture#2 of ?)。另一方面,我无法将它们替换为 Comparable<Object>
要么,因为 main()
中的调用与方法签名不匹配(即 Integer
实现 Comparable<Integer>
而不是 Comparable<Object>
。使用原始类型当然“有效”,但这是正确的方法吗?
最佳答案
问题是一个实例可能有 Comparable<TrainA>
另一个包含 Comapable<TrainB>
和 compare
方法Comparable<TrainA>
不会接受 TrainB
的实例。这就是您使用通配符设置的内容。
你更好的选择是在 Comparable
中放置一个常见的 super 类型IE。 Comparable<Toy>
或Comparable<Object>
.
关于java - 比较和通配符泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8126885/