Antwort läuft darauf hinaus, eine similar questionWarum kann der Java-Compiler die Vererbung nicht richtig ableiten?
-Java does not support lower bounds on parameterized methods, because such a feature is "not useful enough"
finden Sie die folgenden Ausschnitt Gegeben:
package demo;
public class Demo {
interface Foo { void foo(); }
interface Bar { void bar(); }
interface FooBar {
<R extends Foo & Bar> R foobar();
static FooBar create() { return new TypicalJavaFooBar(); }
}
private static final class TypicalJavaFooBar implements Foo, Bar, FooBar {
public void bar() { System.out.println("foo"); }
public void foo() { System.out.println("bar"); }
public <R extends Foo & Bar> R foobar() {
return (R) this;
}
}
public static void main(String[] args) {
FooBar x = FooBar.create();
Foo foo = x.foobar();
Bar bar = x.foobar();
x.foobar().foo();
x.foobar().bar();
}
}
Ohne die explizite Umwandlung zu R
in TypicalJavaFooBar#foobar
Compiler mit dem folgenden Fehler fehlschlägt
Error:(13, 20) java: incompatible types: demo.Demo.TypicalJavaFooBar cannot be converted to R
Meine Frage ist warum? Für mich scheint es, dass der Compiler genügend Informationen haben sollte, da TypicalJavaFooBar
klar definiert ist, sowohl Foo
als auch Bar
zu implementieren; Warum ist das nicht genug, um die Foo & Bar
Einschränkung zu erfüllen?
UPDATE
Das Hauptziel dieser Übung ist es, den folgenden Auftrag zu definieren: Aufruf der Methode foobar
auf einer Instanz eines FooBar
garantiert etwas zurückzukehren, die sowohl Foo
und Bar
implementiert.
@horatius Das hat nichts mit dieser Frage zu tun. – chrylis
In 'TypicalJavaFooBar' können Sie den Rückgabetyp der' foobar' Methode in 'TypicalJavaFooBar' ändern, wodurch die Besetzung ebenfalls entfällt. Während dies Ihre Frage nicht beantwortet, würde ich dies wahrscheinlich in dieser Situation tun.Obwohl ich die Komposition generell über der Vererbung bevorzuge, ist es unwahrscheinlich, dass ich auf diese Situation stoße. :-) – Waldheinz
@Andrey, leider ist dein "Hauptziel" in Javas Typsystem eigentlich nicht möglich. Sie können etwas zurückgeben, das garantiert eine bestimmte Schnittstelle implementiert, aber Sie können nicht "etwas, das diese beiden Schnittstellen implementiert" ausdrücken. –