&LT ;?延伸> Java语法 [英] <? extends > Java syntax

查看:116
本文介绍了&LT ;?延伸> Java语法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

此代码:

 列表< ;?扩展Reader> weirdList; 
weirdList.add(new BufferedReader(null));

有一个编译错误:



列表中的方法add(capture#1-of?extends Reader)不适用于
参数(BufferedReader)
blockquote>

为什么? BufferedReader扩展了读者,为什么不是匹配?

解决方案

对于你给的变量:

 列表< ;?扩展Reader> weirdList; 

以下所有分配都是有效的:

  weirdList = new ArrayList< Reader>(); 
weirdList = new ArrayList< FileReader>();
weirdList = new ArrayList< BufferedReader>();
weirdList = new ArrayList< InputStreamReader>();

希望这可以解释您的编译错误。如果 weirdList 保存的值类型 ArrayList< BufferedReader> ,但是不会使感觉类型 ArrayList< FileReader> 的值。由于类型 List <?>的变量扩展Reader> 可以保存任何一种类型的值(和更多!),Java会调用该错误。



Java中的泛型很难让你的头靠近。你可以想象 List<将Reader> 类型扩展为对方法中的赋值或参数类型非常有用,以便它们可以接受各种类型。对于常规使用,您可能更喜欢使用裸通用类型,如 List< Reader> 甚至 List< BufferedReader> code>。


This code:

List<? extends Reader> weirdList;
weirdList.add(new BufferedReader(null));

has a compile error of

The method add(capture#1-of ? extends Reader) in the type List is not applicable for the arguments (BufferedReader)

Why? BufferedReader extends reader, so why isn't that a "match"?

解决方案

For the variable you gave:

List<? extends Reader> weirdList;

All of the following assignments are valid:

weirdList = new ArrayList<Reader>();
weirdList = new ArrayList<FileReader>();
weirdList = new ArrayList<BufferedReader>();
weirdList = new ArrayList<InputStreamReader>();

Hopefully this explains your compile error. What you're trying makes sense if weirdList holds a value of type ArrayList<BufferedReader>, but doesn't make sense for a value of type ArrayList<FileReader>. Since a variable of type List<? extends Reader> can hold a value of either type (and more!), Java calls that an error.

Generics in Java are hard to get your head around. You can think of the List<? extends Reader> type as being mostly useful for assignment or parameter types in methods so that they can accept a wide variety of types. For "regular use", you're probably better off with a "bare" generic like List<Reader> or even List<BufferedReader>.

这篇关于&LT ;?延伸&gt; Java语法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆