【问题标题】:what does List<? extends SomeClass> mean? [duplicate]什么列表<? extends SomeClass> 是什么意思? [复制]
【发布时间】:2014-01-17 02:50:44
【问题描述】:

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

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

但是&lt;?extends 是什么意思?我能看懂List&lt;SomeClass&gt; 我看不懂List&lt;? extends SomeClass&gt;..

【问题讨论】:

标签: java generics protocol-buffers covariance contravariance


【解决方案1】:

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

1) 上界通配符。 like:ArrayList &lt;? extends Number&gt; p,表示你可以使用任何扩展 Number 来填充 ArrayList。

2) 下界通配符。 喜欢:ArrayList&lt;? super Integer&gt; list, 这意味着您必须传递任何 Integer 的超类(例如 Number、Object)来填充 ArrayList。

更多信息,请参考wildcards

【讨论】:

    【解决方案2】:

    这是generic 声明。

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

    &lt;? extends xxx.yyy.zzz.proto.BasicMessage.DestInfoOrBuilder&gt; 表示 “允许每个扩展 DestInfoOrBuilder 的类”

    【讨论】:

      【解决方案3】:

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

      更多信息请阅读Java Generic's WildcardsGenerics: The wildcard operator

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-27
        • 2015-07-15
        • 2018-07-17
        • 2012-08-13
        相关资源
        最近更新 更多