Java 可比和威尔卡仿制药

Java 可比和威尔卡仿制药,java,generics,comparable,Java,Generics,Comparable,假设我有以下类(用于演示) 如果我将Comparable替换为Comparable,那么编译器会抱怨(如上所述),因为两个强制转换操作不能保证是同一个类(capture#1 of?vs capture#2 of?)。另一方面,我也不能用Comparable替换它们,因为main()中的调用与方法签名不匹配(即,Integer实现了compariable和notcompariable。使用原始类型当然“有效”,但这是正确的方法吗?问题是一个实例可能具有compariable,而另一个实例包含com

假设我有以下类(用于演示)


如果我将
Comparable
替换为
Comparable
,那么编译器会抱怨(如上所述),因为两个强制转换操作不能保证是同一个类(capture#1 of?vs capture#2 of?)。另一方面,我也不能用
Comparable
替换它们,因为
main()
中的调用与方法签名不匹配(即,
Integer
实现了
compariable
和not
compariable
。使用原始类型当然“有效”,但这是正确的方法吗?

问题是一个实例可能具有
compariable
,而另一个实例包含
compariable
compariable
方法将不接受
TrainB
的实例。这是您使用通配符设置的


您最好在
可比
字段中添加一个普通的超级类型,即
可比
可比
,方法是将您的
列车
字段声明为
可比[]
,您断言它是一个特定类型的数组,而您恰好不知道它是哪种类型。两个不同的
Toyset
实例将分别具有
字段,这些字段包含某些特定类型的序列,但每个字段都有不同的特定类型。编译器警告您没有任何内容在代码中,断言指向
Toyset
实例中各种
trains
字段的特定数组类型将具有任何子类型或超类型关系

在这种情况下,返回到原始类型是诚实的;对于要比较的对象的类型,您没有任何有意义的话要说。您可以尝试使用
Comparable
,这允许非常弱地使用类型参数


这个设计让我觉得很奇怪。我假设它是从更大的东西中删去的。玩具组可以比较,这又取决于每个玩具组中包含的火车的字典比较。这很好,但为什么没有所有火车都有共同的上限类型呢?

是的,我有点断章取义,也许是这样我不是很聪明……如果我想让trains成为一个数组,同时也允许原语呢?显然我必须使用包装类,这些包装类不能实现
可比
。例如
Integer实现可比
。这不是类
不能实现可比
和不
可比
的一般模式吗看着循环中的谓词(调用
Comparable#compareTo()
),从两个
序列
数组中取出成对元素(每个
Toyset
实例中有一个),然后将一个元素输入另一个,但您不知道这两个实例中的任何一个的类型。(还要注意的是,不能保证“其他”
trains
数组与当前实例的数组一样长,因此您容易受到
ArrayIndexOutOfBoundsException
的攻击。)您可以将
守车
整数
进行比较,我怀疑其中一个是否知道如何将自身与另一个进行比较。这是您的意图吗?这是真的。我可以,我会在运行时检查它们是否是同一个类,如果发生这种情况,则引发异常。假设这些是数据向量,并且
compareTo()
方法仅在数组中具有相同类型的数据向量上调用(即,不同数据向量之间的任何比较都保证失败)。我添加了一个后续问题,希望能解释更多我得到的信息。。。
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;
     }  
}
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)));
    }
}