Java中的上界通配符 - java

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

  • double method1(List<? extends Number> list)-在这里我使用通配符。
  • <U extends Number> double sumOfList1(List<U> list)-这是类型参数的名称。
  • 两者之间有什么区别还是功能相同?使用类型参数名称代替通配符有什么优势?

    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;
    }
    

    是的,我知道,有更巧妙的方法可以做到这一点-请把它当作一个说明性的例子

    Java中的<<或>>>是什么意思? - java

    This question already has answers here: Closed 7 years ago. Possible Duplicate: What does >> and >>> mean in Java?我在一些Java代码中遇到了一些陌生的符号,尽管代码可以正确编译和运行,但对于括号在此代码中的作用却感…

    List <Dog>是List <Animal>的子类吗?为什么Java泛型不是隐式多态的? - java

    我对Java泛型如何处理继承/多态感到困惑。假设以下层次结构-动物(父母)狗-猫(儿童)因此,假设我有一个方法doSomething(List<Animal> animals)。根据继承和多态性的所有规则,我假设List<Dog>是List<Animal>,而List<Cat>是List<Animal&g…

    与哪些运算符>>兼容 - java

    我这里没有什么代码int b=3; b=b >> 1; System.out.println(b); 它可以完美工作,但是当我将变量b更改为byte,short,float,double时,它包含错误,但是对于变量int和long来说,它可以完美工作,为什么它不能与其他变量一起工作? 参考方案 位移位运算符(例如>>)与任何整数类型兼…

    菱形运算符<>是否等于<?> - java

    我在util.TreeSet类中发现,其中一个构造函数正在使用具有空泛型类型的新TreeMap调用另一个构造函数。 public TreeSet(Comparator<? super E> comparator) { this(new TreeMap<>(comparator)); } new TreeMap<>是什么意思…

    Java-固定大小的列表与指定初始容量的列表之间的差异 - java

    我在理解这一点上遇到了问题。当我们做 List<Integer> list = Arrays.asList(array); 我们不能在该列表上使用添加,删除之类的方法。我知道Arrays.asList()返回固定大小的列表。我不明白的是,如果我们创建一个具有指定初始容量的列表,例如List<Integer> list2 = new A…