Das Problem ist, dass Recursive<?>
die Einschränkung auf Base
's-Typ Parameter nicht erfüllt.
Wenn Sie Base<R>
erweitern möchten, müssen Sie etwas für R
liefern, das ist auch ein Recursive<R>
. Recursive<?>
ist nicht gut genug, weil der Compiler Recursive<?> extends Recursive< Recursive<?> >
nicht herausfinden kann.
sie nicht wirklich Sinn machen, eine Base
unbekannter Art zu erweitern, aber Sie können eine heterogene Sammlung von ihnen erklären:
Collection< Base<?> > cb; // ok for some reason
Collection< Base< Recursive<?> > > cbr; // not ok!
Von Ihrem Kommentar wissen wir Base
wie
public abstract class Base< R extends Recursive<R> > {
public abstract R[] foo();
}
sieht
Für jedes qualifizierende R
können Sie natürlich
public class Derived< R extends Recursive<R> > extends Base<R> {
@Override public R[] foo() {
return (R[])new Object[] { r1, r2 };
}
}
tun
aber es ist nicht klar aus Ihrem Kommentar, dass dies das ist, was Sie wollen. Weißt du, was die spezifische R
ist, die Sie Derived
verwenden möchten?
EDIT die folgenden kompiliert. würde das genügen?
interface Recursive< R extends Recursive<R> > {}
abstract class Base< R extends Recursive< ? extends R > > {
abstract public R[] foo();
}
class Derived extends Base< Recursive<?> > {
public Recursive<?>[] foo() { return null; }
}
EDIT 2 für die Änderung Anpassung an den Original-Beitrag:
interface Recursive< R extends Recursive<R> > {}
interface Use< R extends Recursive< ? extends R > > {}
abstract class Base< R extends Recursive< ? extends R > > {
abstract public Use<R>[] foo();
}
class Derived extends Base< Recursive<?> > {
@Override public Use< Recursive<?> >[] foo() { return null; }
}
Was wollen Sie in der abgeleiteten Klasse tun? Wird der Code kompiliert? –
'Derived erweitert Basis' sollte genug sein. –
aber dann bekomme ich eine Warnung, weil ich einen rohen Typ verwende, gibt es einen Weg, ohne diese Warnung zu bekommen? – MZuenni