【问题标题】:Java bounded generic covarianceJava 有界泛型协方差
【发布时间】:2013-08-02 13:38:45
【问题描述】:

由于在下面的代码中,R 扩展了 Appendable,我不应该能够在需要 R 的地方返回 Appendable 吗?

/**
  * Produces an R, to which a T has been semantically appended,
  * whatever that may mean for the given type.
  */
interface Appendable <R, T>
{
    /**
     * Append is not expected to modify this Appendable,
     * but rather to return an R which is the result
     * of the append.
     */
    R append(T t);
}

interface PluralAppendable <R extends Appendable<R, T>, T>
    extends Appendable<R, T>
{
    default R append(T... els)
    {
        // Easier to debug than folding in a single statement
        Appendable<R, T> result = this;
        for(T t : els) 
            result = result.append(t);

        /* Error: Incompatible types.
           Required: R
           Found: Appendable<R, T> */
        return result;
    }
}

【问题讨论】:

  • 如何在接口中定义方法,这段代码无法编译。
  • 所以,就像return (R) result; 一样投射它?好吧,我只是想确保我理解这个权利并且那个演员表是有效的。如果您的意思是将结果声明为 R,如R result = this;,则会引发“不兼容的类型:必需的 R,找到 PluralAppendable,这确实有意义,因为 PluralAppendable 不扩展 R,它扩展了 Appendable
  • 接口中的“默认”修饰符和方法体在我正在使用的 Java 8 中可用
  • @MattG。哦!对不起。还没用过Java 8。

标签: java generics covariance java-8


【解决方案1】:

由于在下面的代码中,R 扩展了 Appendable,我不应该能够在需要 R 的地方返回 Appendable 吗?

不,你不能。如果继承是相反的,你只能这样做。

但是,您可以将 result 向下转换为 R 以使其编译,但它会向您显示 Unchecked Cast 的警告。

return (R)result;

【讨论】:

    【解决方案2】:

    可以做相反的事情。当您应该返回超类的引用时,您可以返回子类。在您的示例中,您尝试相反地执行此操作,当然您需要对 R 类型的 Object 的引用。您不能将其超类的 Object 传递给 R 的引用。

    【讨论】:

      猜你喜欢
      • 2011-02-09
      • 2020-11-20
      • 1970-01-01
      • 2012-09-29
      • 2018-04-04
      • 2018-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多