Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java泛型混淆_Java_List_Generics - Fatal编程技术网

Java泛型混淆

Java泛型混淆,java,list,generics,Java,List,Generics,我对java泛型有点困惑 这是密码 class Base{} class Derived extends Base{} 我们可以像这样实例化一个列表 List<? extends Base> list = new ArrayList<Base>(); list.add(new Base()); 所以用户不能使用add方法作为通配符?在遗传学类型中 谢谢PECS-生产者延伸,消费者超级 如果将extends替换为super,则可以添加新的基 列出只要做就行 Lis

我对java泛型有点困惑

这是密码

class Base{}

class Derived extends Base{}
我们可以像这样实例化一个列表

List<? extends Base> list = new ArrayList<Base>();
list.add(new Base()); 
所以用户不能使用add方法作为通配符?在遗传学类型中


谢谢

PECS-生产者延伸,消费者超级

如果将extends替换为super,则可以添加新的基

列出只要做就行

List<Base> list = new ArrayList<Base>();
当您知道实际类型时,不应使用通配符。。。就在你被提供了未知类型的东西的时候

在这种情况下?extendsbase意味着列表只允许包含Base的某些特定子类型,但您不知道这是哪一个子类型。因此,您只能在列表中添加null。

您可以尝试阅读吗?作为某事:

List<? extends Base>

这是按Base扩展的内容列表。因此,您可以在那里添加一个基,就像您可以在列表中添加一个字符串一样,因为对象是通过字符串扩展的。

我认为这是Java泛型的设计。通配符?extends Base的编译意味着集合引用可以指向一个集合对象,该集合对象可以包含扩展Base的任何和所有类型。您也可以这样编写:

List<? extends Base> _listBaseSubtypes = new ArrayList<Derived>();
我认为Java设计者决定允许第一行代码有效。为了避免第二行代码可能导致的运行时错误,将在编译时捕获它

话虽如此,我想到的问题是:考虑到实际的集合对象可以是“任意”派生类型的集合,应该允许将什么类型的对象添加到集合中


因为您可以根据需要派生任意多个类型,并且找不到与实际集合对象中保存的类型分配兼容的单一类型请记住,集合对象可以声明为保存“any”派生类型,所以问题的简单答案是:无。因此,您不能通过add接口将任何对象添加到集合中,因为对于您可能尝试传递到add方法中的任何对象,编译器都会提出异议,原因是该类型与实际集合对象所持有的类型不兼容。

该首字母缩写词本身并不是很有用;详细信息请参见。@Torgamus勋爵-是的,我已经扩展了我的答案,添加了适当的解释。但是声明类型为List@Bozho是的,我看到了,你的更新和我的评论相隔两秒。不过,我仍然认为这是一个很好的链接,所以我将把它留在那里。@Torgamus勋爵-是的,绝对如此+链接为1
List<? extends Base> _listBaseSubtypes = new ArrayList<Derived>();
        _listBaseSubtypes.add(new Base());