Pregunta

Since in the following code, R extends Appendable, shouldn't I be able to return an Appendable where an R is expected?

/**
  * 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;
    }
}
¿Fue útil?

Solución

Since in the following code, R extends Appendable, shouldn't I be able to return an Appendable where an R is expected?

No, you can't. You can only do this, if the inheritance was the other way round.

However, you can downcast result to R, to make it compile, but it will show you warning of Unchecked Cast.

return (R)result;

Otros consejos

The opposite can be done. You can return a subclass when you should return a reference of a superclass. In your example you try to do it inversely and of course you need a reference for an Object of type R. You cannot pass an Object of its superclass to a reference of R.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top