说<有什么用?扩展一些对象>而不是 <SomeObject>

Whats the use of saying lt;? extends SomeObjectgt; instead of lt;SomeObjectgt;(说lt;有什么用?扩展一些对象而不是 lt;SomeObjectgt;)

本文介绍了说<有什么用?扩展一些对象>而不是 <SomeObject>的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

So I was looking over some Java code and stumbled upon:

List<? extends SomeObject> l;

basically this list accepts all objects that are some kind of SomeObject - SomeObject itself or its inheritors. But according to polymophism, it's inheritors can also be seens as SomeObject, so this would work as well:

List<SomeObject> l;

So why would someone use the first option when the second is clearly defined and virtually identical?

解决方案

List<SomeObject> l;

In this you cannot say List<SomeObject> l = new ArrayList<SubClassOfSomeObjectClass>;(not allowed) wheres for

List<? extends SomeObject> l;

you can say

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

But note that in List<? extends SomeObject> l = new ArrayList<SubClassOfSomeObject>; you cannot add anything to your list l because ? represents unknown class (Except null of-course).

Update: For your question in the comment What could I possibly do with a list if I cannot add anything to it?

Now consider a case in which you have to write a function to print your list but mind you it must only accept a List having objects which are subclasses of your SomeObject. In this case as I stated above you cannot use

public void printList(List<SubClassOfSomeObjectClass> someList)

So what would you do? You would do something like

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

这篇关于说&lt;有什么用?扩展一些对象>而不是 &lt;SomeObject&gt;的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本文标题为:说&lt;有什么用?扩展一些对象>而不是 &lt;SomeObject&gt;

基础教程推荐