< ;?延伸> Java语法 [英] <? extends > Java syntax
问题描述
此代码:
列表< ;?扩展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 typeArrayList<BufferedReader>
, but doesn't make sense for a value of typeArrayList<FileReader>
. Since a variable of typeList<? 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 likeList<Reader>
or evenList<BufferedReader>
.这篇关于< ;?延伸> Java语法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!