java - 比较和通配符泛型

标签 java generics comparable

假设我有以下类(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)));
    }
}

如果我替换ComparableComparable<?>然后编译器会提示(如上所述),因为不能保证两个强制转换操作是同一个类(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/

相关文章:

java - 在java中打开windows资源管理器

java - 反弹弹?

java - 文件写入器中现有多行字符串的新行

java - java泛型的类层次结构问题

java - 可比较内部的参数 (Java)

java - 在 Java Servlet 中为 Double 赋值时出错

c# - 似乎无法让通用协方差/逆变工作

java - 泛型、删除和字节码

java - 如何对集合中的两个不同对象进行排序?

java - 非抽象类不能重写Comparable中的抽象方法compareTo吗?