- 此问题在此处已有答案**:
Java Generics (Wildcards)(7个答案)
List<Map<String, String>> vs List<? extends Map<String, String>>(5个答案)
八年前就关门了。
我在protobuf生成的java文件中看到了这个定义:
java.util.List<? extends xxx.yyy.zzz.proto.BasicMessage.DestInfoOrBuilder> foo();
但是<?
和extends
是什么意思?我能理解List<SomeClass>
,我不能理解List<? extends SomeClass>
。
3条答案
按热度按时间djp7away1#
在java泛型编程中,使用通配符时有两种界限。
1)上限通配符。例如:
ArrayList <? extends Number> p
,这意味着您可以使用任何扩展Number的内容来填充ArrayList。2)下限通配符,如:
ArrayList<? super Integer> list
,这意味着您必须传递Integer超类中的任何内容(如Number、Object)来填充ArrayList。有关详细信息,请参阅wildcards。
vmdwslir2#
这是一个generic声明。
它用于在编译时检查类型。你可以将任何对象放入列表中,但是如果使用不当,这会使它更难维护,并且可能导致
ClassCastException
s。<? extends xxx.yyy.zzz.proto.BasicMessage.DestInfoOrBuilder>
表示 “允许扩展DestInfoOrBuilder
的每个类“。zpqajqem3#
在
java generic code
中,问号**(?)称为通配符**,表示未知类型。通配符可用于多种情况:作为参数、字段或局部变量的类型;有时作为返回类型(尽管更具体的编程实践更好)。2通配符从不用作泛型方法调用、泛型类示例创建或超类型的类型参数。有关详细信息,请阅读Java Generic's Wildcards和Generics: The wildcard operator