Java限制了通用协方差

时间:2013-08-02 13:38:46

标签: java generics covariance java-8

由于在以下代码中,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;
    }
}

2 个答案:

答案 0 :(得分:5)

  

由于在以下代码中,R扩展为Appendable,我是否应该能够在需要R的地方返回Appendable?

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

但是,您可以将result向下转换为R,以使其进行编译,但它会向您显示未经检查的投射的警告。

return (R)result;

答案 1 :(得分:3)

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