为了账号安全,请及时绑定邮箱和手机立即绑定

java 比较器可以识别类型吗?

java 比较器可以识别类型吗?

郎朗坤 2023-08-16 10:03:05
我想要一种简单的方法来基于任何给定的 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;        }    }}
查看完整描述

1 回答

?
守候你守候我

TA贡献1802条经验 获得超10个赞

让我们看看你的ComponentCreator


private static class ComparatorCreator<T extends Comparable<? super T>>{

    public Comparator<? extends T> getComparator()

    {

        return T::compareTo;

    }

}

如果稍微改变一下以使你的错误更清楚


private static class ComparatorCreator<T extends Comparable<? super T>>{

    public Comparator<? extends T> getComparator()

    {

        return (o1, o2) -> {

            return o1.compareTo(o2);

        };

    }

}

您使用的方法引用与我的 lambda 相同,但它使错误更加明显。如果我们一一检查您的样品,我们可以看到以下内容:


comp.compare(bbig, bsmall); // calls bbig.compareTo(bsmall)

comp.compare(bbig, small); // calls bbig.compareTo(small)

comp.compare(big, small); // calls big.compareTo(small)

comp.compare(big, bsmall); // calls big.compareTo(bsmal)

您收到的输出是有意义的,因为big.compareTo()将调用compareTo()该类的函数Integer。


查看完整回答
反对 回复 2023-08-16
  • 1 回答
  • 0 关注
  • 107 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信