Gegeben eine API wie:
%Vor% In Javas Optional
type können wir sagen:
Aber da Foo
ein Bar
ist, würde ich gerne sagen können:
Als Übung wollte ich dies mit einem anderen Typ erreichen:
%Vor%Wie würde ich das zum Kompilieren umschreiben, aber auch die Möglichkeit unterstützen, den Typ bei Bedarf gleichzeitig zu erweitern?
Aber, da
istFoo
einBar
Aber Bar
ist kein Foo
. Was ich meine ist, dass Sie das tun können:
Aber Sie können nicht dasselbe mit Optional<Foo>
tun, weil es die Typbeschränkungen von Optional.orElse
Methode.
Bei der hypothetischen Implementierung von Option<T>
sollten Sie U
explizit als Obertyp von T
In diesem Fall könnten Sie einen Code wie diesen schreiben
%Vor% Da U
der Super-Typ von T
sein sollte, könnten Sie Folgendes tun:
Sie können Ihre eigene Methode mit map
definieren, um den Typ zu erweitern:
Es gibt eine grundlegende Prämisse, die in Ihrer Frage fehlerhaft ist:
Im optionalen Typ von Java können wir sagen:
Optional fooOption = ... fooOption.orElse (aFoo) // gibt etwas vom Typ Foo zurück Aber da Foo eine Bar ist, würde ich gerne sagen können:
Optional fooOption = ... fooOption.orElse (aBar) // gibt etwas vom Typ Bar
zurück
A Foo ist eine Bar, aber eine Bar ist kein Foo. Wenn Ihr Generic wie folgt definiert ist:
%Vor% Dann können Sie alles zurückgeben, was vom Typ Foo
ist. A Bar
ist nicht vom Typ Foo
.
Wenn Sie ein zusätzliches Objekt hatten:
%Vor%Dann könntest du es in deinem Beispiel auf ein foo umwandeln:
Optional fooOption = ...
fooOption.orElse (aFooBar) // gibt etwas vom Typ Foo
zurück
Oder, falls Sie Ihre Optional
als Optional<Bar>
definiert haben, können Sie entweder Foo
oder Bar
oder FooBar
Objekte verwenden, da sie alle vom Typ Bar
sind oder von diesem erben.
Was den zweiten Teil Ihrer Frage betrifft:
%Vor%Einfach mit dem gemeinsamen Supertyp schreiben:
%Vor%Sie sagen, dass alles, was von oder von Typ T erbt, akzeptabel ist.