Ich habe eine Java-Schnittstelle wie dieseBounded Typ Parameter Ausgabe Casting
public interface MyInterface<T> {
public <V extends T> V get(String key, Bundle bundle);
}
Sie bitte die <V extends T>
Typparameter des Verfahrens beachten.
Dann habe ich eine Klasse MyFoo implements MyInterface
class MyFoo implements MyInterface<Object> { // Object because can be any type
@Override public <V> V get(String key, Bundle bundle) {
return new Other();
}
}
Also, wenn ich jetzt eine Klasse wie diese:
class Bar {
public Other other;
public Other setOther(Other other);
}
Dann will ich MyFoo
nehmen Other
in einer Bar
Instanz zu setzen:
MyFoo foo = new MyFoo();
Bar bar = new Bar();
bar.other = foo.get();
Das funktioniert perfekt. Typ kann durch Java Generics bestimmt werden. Es ist keine zusätzliche Besetzung erforderlich.
MyFoo foo = new MyFoo();
Bar bar = new Bar();
bar.setOther(foo.get()); // Fails
Dann bekomme ich die folgende Compiler-Fehler:
error: incompatible types: Object cannot be converted to Other
Ich verstehe nicht, warum diese doesn
Wenn ich jedoch bar.setOther()
dann die Art verwenden möchten, können nicht ermittelt werden Funktioniert nicht für die bar.setOther(foo.get())
Methode funktioniert aber beim direkten Zugriff auf das Feld bar.other = foo.get()
Jede Idee, wie Sie das ohne Addin zu lösen Ein zusätzlicher Cast wie bar.setOther((Other) foo.get())
Ja, das ist eine Art Workaround. Also kann der Compiler den Typparameter von 'setOther()' nicht betrachten? Klingt seltsam ... – sockeqwe
@dasblinkenlight Ich werde den JLS-Abschnitt ausgraben, aber ich denke, es hat damit zu tun, dass eine Methode für viele Parameterarten überladen werden kann und die JLS die Methodenauswahl nicht überladen lassen wollte Betontypauswahl für generische Typen interferieren miteinander. –
überladen Methoden ... klingt plausibel – sockeqwe