为什么我不能把超类放到Java的下界列表中?[已关闭]

j9per5c4  于 2022-12-25  发布在  Java
关注(0)|答案(1)|浏览(117)
    • 已关闭**。此问题需要超过focused。当前不接受答案。
    • 想要改进此问题吗?**更新此问题,使其仅关注editing this post的一个问题。

15小时前关门了。
Improve this question
正在读取Oracle Java docs
Say you want to write a method that puts Integer objects into a list. To maximize flexibility, you would like the method to work on List, List, and List — anything that can hold Integer values.
To write the method that works on lists of Integer and the supertypes of Integer, such as Integer, Number, and Object, you would specify List<? super Integer>. The term List is more restrictive than List<? super Integer> because the former matches a list of type Integer only, whereas the latter matches a list of any type that is a supertype of Integer.
我试过这段代码,但它无法编译。

class MyNumber extends Number { ...  }

还有这个。

List<? super Integer> list = new ArrayList<>();
        list.add(1); // Ok
        list.add(new Object()); // Not Ok!

那么下界背后的想法是什么呢?
另外,另一件事引起了我的注意,使用上限,我们可以确保当我们调用超/父类上的方法时,子类必须拥有该方法,但使用下限,情况就不一样了,如下面的代码所示,所以同样,捕获在哪里,或者我们从下限中获得了什么?

Arrays.asList("one","two","three").stream().forEach(new Consumer<String>() {  // Accept it as a param.
    @Override
    public void accept(String s) {
        System.out.println(s.toLowerCase());  // OK!
    }
});

Arrays.asList("one","two","three").stream().forEach(new Consumer<Object>() {   //Accept it as a param.
    @Override
    public void accept(Object s) {
        System.out.println(s.toLowerCase()); // NOT OK! What is the idea then? 
    }
});
gkn4icbw

gkn4icbw1#

通配符泛型类型仍然引用一个特定的类。
所以当你写List<? super Integer>的时候,你并不是在定义一个可以容纳Integer对象或者Integer的超类的List,而是在定义一个可以容纳Integer或者它的超类的List,但是它仍然是一个具体的类,例如,List<? super Integer> list = new ArrayList<Integer>();List<? super Integer> list = new ArrayList<Object>();对于您在这里处理的实际List对象都是可能的。
而且您只能将Integer对象添加到该通配符List,因为它是编译器可以验证添加到List中是否始终有效的唯一类。
eG考虑:

List<Object> objectList = new ArrayList<Object>();
List<? super Integer> list = objectList;
list.add(1); // Ok, anything can go into List<Object>
list.add(new Object()); // would also be OK in this case

以及

List<Integer> integerList = new ArrayList<Integer>();
List<? super Integer> list = integerList;
list.add(1); // Ok
list.add(new Object());  // Not Okay! You now have an Object in your List<Integer>

因为编译器不知道通配符泛型类型背后的非通配符List是什么,所以它只允许添加一个Object类型,它知道该类型对于所有可能性都是有效的,即Integer

相关问题