假设我有以下课程(出于演示目的)
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;
}
}
编译器告诉我
“类型中的方法 compareTo(capture#1-of ?)
Comparable<capture#1-of ?>
不适用于参数 (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<?>
那么编译器会抱怨(如上所述),因为不能保证两个强制转换操作是同一个类(捕获#1 of ? vs capture#2 of ?)。另一方面,我不能用它们替换它们Comparable<Object>
,因为调用main()
不匹配方法签名(即Integer
实现Comparable<Integer>
而不是Comparable<Object>
。使用原始类型肯定“有效”,但这是正确的方法吗?