2

次のコードでは、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;
    }
}
4

2 に答える 2

5

次のコードでは、R が Appendable を拡張しているため、R が期待される場所で Appendable を返すことはできませんか?

いいえ、できません。継承が逆の場合にのみ、これを行うことができます。

ただし、にダウンキャストresultRてコンパイルすることはできますが、 Unchecked Castの警告が表示されます。

return (R)result;
于 2013-08-02T13:45:37.493 に答える
3

反対のことができます。スーパークラスの参照を返す必要がある場合は、サブクラスを返すことができます。あなたの例では、それを逆にしようとしていますが、もちろん、タイプ R のオブジェクトの参照が必要です。そのスーパークラスのオブジェクトを R の参照に渡すことはできません。

于 2013-08-02T13:45:57.957 に答える