我在protobuf生成的java文件中看到了这个定义:
java.util.List<? extends xxx.yyy.zzz.proto.BasicMessage.DestInfoOrBuilder> foo();
但是<?
和extends
的剂量是什么意思? 我能理解List<SomeClass>
我不能理解List<? extends SomeClass>
..
在 Java 泛型编程中,使用通配符时有两种边界。
1)上限通配符 .比如:ArrayList <? extends Number> p
,这意味着你可以使用任何扩展数字来填充数组列表。
2)下界通配符。如: ArrayList<? super Integer> list
,这意味着您必须传递 Integer 的超类(例如 Number、Object)中的任何内容才能填充 ArrayList。
有关详细信息,请参阅通配符。
这是一个泛型声明。
它用于在编译时检查类型。您可以将任何对象放入列表中,但这会使维护更加困难,并且如果使用不当,可能会导致ClassCastException
。
<? extends xxx.yyy.zzz.proto.BasicMessage.DestInfoOrBuilder>
的意思是"允许每个扩展DestInfoOrBuilder
类"。
在java generic code
中,问号 (?) 称为通配符,表示未知类型。通配符可用于多种情况:作为参数、字段或局部变量的类型;有时作为返回类型(尽管更具体的编程实践更好)。通配符从不用作泛型方法调用、泛型类实例创建或超类型的类型参数。
有关更多信息,请阅读 Java 泛型的通配符和泛型:通配符运算符