亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 140 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號