繁体   English   中英

Java中的上边界通配符

[英]Upper Bounded wildcards in Java

我有两个通用的方法来计算List的元素总和。 方法的签名是

  1. double method1(List<? extends Number> list) - 这里我使用的是通配符。

  2. <U extends Number> double sumOfList1(List<U> list) - 这里有一个type参数的名称。

这两者之间有什么区别,或者它们在功能方面是否相同? 使用类型参数名称而不是通配符有什么优势?

public static double sumOfList(List<? extends Number> list) {
    double s = 0.0;
    for (Number n : list)
        s += n.doubleValue();
    return s;
}

 public static <U extends Number> double sumOfList1(List<U> list) {
    double s = 0.0;
    for (Number n : list)
        s += n.doubleValue();
    return s;
}

谢谢。

绝对没有区别,声明U的目的是让你可以使用它:

public static <U extends Number> void doSomething(List<U> list, Consumer<U> sink) {
    list.forEach(sink::accept)
}

这意味着你不关心U什么 ,但它必须从Number扩展。 您关心的是List包含的类型与Consumer可以接受的类型兼容。


或者,您可以在方法内使用U来声明泛型类型的新实例:

public static <U extends Number> List<U> copy(List<U> list) {
    List<U> copy = new ArrayList<>();
    copy.addAll(list)
    return copy;
}

是的,我知道,有更简洁的方法可以做到这一点 - 请将其视为一个说明性的例子

由于您没有在此方法中使用U ,因此它们没有区别。

由于类型擦除,最终执行的代码是相同的,因此使用一个而不是另一个没有区别。

类型擦除在本网站中解释如下:

仅在编译时强制执行类型约束并在运行时丢弃元素类型信息的过程。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM