Class <!-有什么区别?扩展T->和Class <!-?扩展?->在Java中?

时间:2018-12-28 07:00:34

标签: java generics

我正在研究应用程序中的一些旧代码,发现使用Java泛型。

能告诉我,两者之间有什么区别

Class<? extends T>

Class<? extends ?>

我不清楚如何以及何时使用这些泛型。

2 个答案:

答案 0 :(得分:4)

Class<? extends ?>在Java中不是有效的类型。

Class<? extends T>是Java中的有效类型。

答案 1 :(得分:1)

Class<? extends T>示例:

Class<? extends Number>可以是Class<Number>Class<Integer>Class<BigDecimal>等...换句话说,就是 any 扩展了的类 Number类。在编译时间检查!

另一方面,Class<? extends ?>可以解释为扩展任何类的任何类的类,这是胡说八道。

编辑: 您正在要求使用。这是一个使用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));

    }
}

我希望您可以从此代码中获得一些基本提示。