簡體   English   中英

類有什么區別<? extends T>和班級<? extends ?>在爪哇?

[英]What is the difference between Class<? extends T> and Class<? extends ?> in Java?

我在我的應用程序中瀏覽了一些遺留代碼,我發現了 Java 泛型的用途。

你能告訴我,這兩者之間有什么區別嗎?

Class<? extends T>

Class<? extends ?>

我不清楚如何以及何時使用這些泛型。

Class<? extends ?> Class<? extends ?>不是 java 中的有效類型。

Class<? extends T> Class<? extends T>是 java 中的有效類型。

Class<? extends T Class<? extends T > 示例:

Class<? extends Number> Class<? extends Number>可以是Class<Number>Class<Integer>Class<BigDecimal>等……換句話說,任何擴展Number類的類。 那是在編譯時檢查的!

另一方面Class<? extends ?> Class<? extends ?>可以被解釋為擴展任何類的任何類的類型,這是無稽之談。

編輯:您要求使用。 下面是一個使用List<? extends Number> List<? extends Number>計算列表中所有數字的總和和平均值:

public class Help {

    private static BigDecimal sum(List<? extends Number> list) {
        return list == null || list.isEmpty() ?
                BigDecimal.ZERO :
                list.stream()
                        .map(n -> new BigDecimal(n.doubleValue()))
                        .reduce(BigDecimal::add)
                        .get();
    }

    private static BigDecimal average(List<? extends Number> list) {
        return list == null || list.isEmpty() ?
                BigDecimal.ZERO :
                sum(list).divide(BigDecimal.valueOf(list.size()), MathContext.DECIMAL32);
    }

    public static void main(String[] args) {

        List<Number> numbers =
                List.of(
                        1.0D,                           /*double*/
                        2.0F,                           /*float*/
                        3L,                             /*long*/
                        new BigInteger("4"),            /*BigInteger*/
                        new AtomicInteger(5),           /*just for test*/
                        (int)'a'                        /*int*/
                );

        System.out.println("sun of " + numbers + " = " + sum(numbers));
        System.out.println("avg of " + numbers + " = " + average(numbers));
        System.out.println("sum of empty list = " + sum(List.of()));
        System.out.println("avg of empty list = " + average(List.of()));
        System.out.println("sum of null list = " + sum(null));
        System.out.println("avg of null list = " + average(null));

    }
}

我希望你能從這段代碼中得到一些基本的技巧。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM