怎么用<?扩展SomeObject>而不是<SomeObject>

Or *_*ser 29 java generics polymorphism

所以我查看了一些Java代码并偶然发现:

List<? extends SomeObject> l;
Run Code Online (Sandbox Code Playgroud)

基本上这个列表接受SomeObject的某些对象 - SomeObject本身或其继承者.但是根据多态性,它的继承者也可以像SomeObject一样,所以这也可以:

List<SomeObject> l;
Run Code Online (Sandbox Code Playgroud)

那么,当第二个选项明确定义并且几乎相同时,为什么有人会使用第一个选项?

Ani*_*kur 31

List<SomeObject> l;
Run Code Online (Sandbox Code Playgroud)

在这里你不能说List<SomeObject> l = new ArrayList<SubClassOfSomeObjectClass>;(不允许)为

List<? extends SomeObject> l;
Run Code Online (Sandbox Code Playgroud)

你可以说

List<? extends SomeObject> l = new ArrayList<SubClassOfSomeObject>;(允许)

但请注意,List<? extends SomeObject> l = new ArrayList<SubClassOfSomeObject>;不能在列表中添加任何内容,因为?代表未知类(当然无效).

更新: 在评论中提问What could I possibly do with a list if I cannot add anything to it?

现在考虑一种情况,你必须编写一个函数来打印你的列表,但请注意,它必须只接受一个List,它有一些对象是SomeObject的子类.在这种情况下,如上所述,你不能使用

public void printList(List<SubClassOfSomeObjectClass> someList)

那你会怎么做?你会做的事情

    public void printList(List<? extends SomeObject> someList) {
        for(SomeObject myObj : someList) {
             //process read operations on  myObj
        }
Run Code Online (Sandbox Code Playgroud)