List <! - 是什么?扩展SomeClass - >是什么意思?

时间:2013-12-30 08:18:28

标签: java generics protocol-buffers covariance contravariance

我在protobuf生成的java文件中看到了这个定义:

java.util.List<? extends xxx.yyy.zzz.proto.BasicMessage.DestInfoOrBuilder> foo();

<?extends的剂量是多少?我理解List<SomeClass>我无法理解List<? extends SomeClass> ..

3 个答案:

答案 0 :(得分:3)

在java泛型编程中,使用通配符时有两种边界。

1)上限有界的通配符。 比如:ArrayList <? extends Number> p,这意味着你可以使用任何extends extends来填充ArrayList。

2)降低有界通配符。 像:ArrayList<? super Integer> list, 这意味着你必须传递任何Integer的超类(如Number,Object)来填充ArrayList。

有关详细信息,请参阅wildcards

答案 1 :(得分:1)

java generic code中,问号(?),称为通配符,表示未知类型。通配符可用于各种情况:作为参数,字段或局部变量的类型;有时作为返回类型(虽然更好的编程实践更具体)。通配符从不用作泛型方法调用,泛型类实例创建或超类型的类型参数。

有关详细信息,请参阅Java Generic's WildcardsGenerics: The wildcard operator

答案 2 :(得分:1)

这是generic声明。

它用于在编译时检查类型。您可以将任何对象放入列表中,但这会使维护更加困难,如果使用不合适,可能会导致ClassCastException

<? extends xxx.yyy.zzz.proto.BasicMessage.DestInfoOrBuilder>表示“允许每个扩展DestInfoOrBuilder 的课程。