【问题标题】:How to grok bounded wildcards in Java?如何在 Java 中理解有界通配符?
【发布时间】:2017-03-14 22:53:09
【问题描述】:

wikipedia article about co- and contravariance 中有一个示例用例,然后是一个解释性句子,描述了类型声明的含义。我觉得这非常有用。看了几遍解释,感觉我明白了。

<T extends Comparable<? super T>> T max(Collection<T> coll);

有界通配符? super T 传达max 仅从Comparable 接口调用逆变方法的信息。

有人可以用类似的语言解释一下,java.util.function.Consumer@FunctionalInterfaceandThen() 函数的类型声明是什么意思:

public interface Consumer<T> {
    void accept(T t);
    default Consumer<T> andThen(Consumer<? super T> after) {

例如

有界通配符? super T 传达andThen ....的信息?


我还有一个次要问题:我怎样才能找到自己,这样的类型声明意味着什么?例如。在上面来自java.util.Collections util 类的第一个示例中:类的类型边界如何 - T - 能够传达有关 T 的方法正在做什么的信息?任何人都可以指出 Java 语言规范中的相关段落吗?

【问题讨论】:

  • 最后一个问题与this重复。
  • this 可能会回答其余的问题。
  • 这个词是“grok”,而不是“grock”。
  • 好的,谢谢你的链接 shmosel。我删除了最后一个问题,因为它确实已经在那里得到了回答。但是,对于第一个问题,填补空白会很棒,我很想为第二个问题获得指向 Java 语言规范相关部分的指针。感谢 Lew 的拼写帮助。

标签: java types covariance contravariance


【解决方案1】:

第一个问题的可能答案:

public interface Consumer<T> {
    void accept(T t);
    default Consumer<T> andThen(Consumer<? super T> after) {

有界通配符? super T 传达andThen 接受T 的消费者或T 的超类型(又名)的信息。 逆变消费者,作为参数。


第二个问题的可能答案:https://stackoverflow.com/a/2501513

基本上 - 完全独立于泛型 (!) - Java 语言中的 method return return types are inherently "covariant"(假定为“生产者”)。如果重写子类中的方法,您始终可以声明更具体的返回类型。

方法参数当然也是“协变的”——你只能传递比方法签名指定的更具体的对象。但是在子类上,虽然该方法在技术上是 not overriden for non-parametric arguments - 遵循 Liskov_substitution_principle - 在子类中声明“逆变”参数类型通常是有意义的,如果名称和其他参数相等 - “重载”父类中的方法。 “静态”(引用类型管理)方法调度将确保(不太具体的)子方法被称为获胜。假设方法参数被“消耗”,然后应用 PECS。无论如何,对于泛型参数,bridge methods are generated 这有点多毛。但我们会getthere

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多