我想要一种简单的方法来基于任何给定的 Comparable 类创建 Comparator 对象,因此我编写了 ComparatorCreator 对象,我相信它会查看其泛型的类型并返回正确的 Comparator 对象,我可以用它来比较该对象的对象类型。所以我写了下面的代码来测试我的想法。我的信念是,由于 BackwardsInt 类的 Compareto 方法是一个反向比较器,它应该能够以相反的顺序比较任何两个数字。但当它遍历这些语句时,它在比较两个整数时完全忽略了反转,甚至抛出了一个错误。我想知道为什么会发生这种情况。我创建的比较器似乎知道我在其参数中传递的数字的类型。
(不久前我也真正陷入了有界通配符,所以如果这导致了问题,那么哎呀)。
import java.util.Comparator;
public class what {
public static void main(String[] ignoreme)
{
Comparator comp = new ComparatorCreator<BackwardsInt>().getComparator();
//comp should represent a Comparator<Number> which redirects to BackwardsInt.compareTo
int big=6;
int small=2;
BackwardsInt bbig=new BackwardsInt(6);
BackwardsInt bsmall=new BackwardsInt(2);
System.out.println(comp.compare(bbig, bsmall));//prints -1 good
System.out.println(comp.compare(bbig, small));//prints -1 good
System.out.println(comp.compare(big, small));//prints 1 why?
System.out.println(comp.compare(big, bsmall));//throws error?!?
}
private static class ComparatorCreator<T extends Comparable<? super T>>{
public Comparator<? extends T> getComparator()
{
return T::compareTo;
}
}
private static class BackwardsInt extends Number implements Comparable<Number>{
private int val;
public BackwardsInt(int v)
{
val=v;
}
@Override
public int compareTo(Number o) {
double d = o.doubleValue()-val;
if(d>0)
return 1;
if(d<0)
return -1;
return 0;
}
public int intValue() {
return val;
}
public long longValue() {
return val;
}
public float floatValue() {
return val;
}
public double doubleValue() {
return val;
}
}
}
守候你守候我
相关分类