Gegeben 'T' und 'U' wo 'T extends U' wie man ein 'U' zurückgibt

8

Gegeben eine API wie:

%Vor%

In Javas Optional type können wir sagen:

%Vor%

Aber da Foo ein Bar ist, würde ich gerne sagen können:

%Vor%

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?

    
Scoobie 01.09.2016, 17:14
quelle

4 Antworten

6
  

Aber, da Foo ein Bar

ist

Aber Bar ist kein Foo . Was ich meine ist, dass Sie das tun können:

%Vor%

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

definieren %Vor%

In diesem Fall könnten Sie einen Code wie diesen schreiben

%Vor%     
vsminkov 01.09.2016, 17:24
quelle
3

Da U der Super-Typ von T sein sollte, könnten Sie Folgendes tun:

%Vor%     
Konstantin Yovkov 01.09.2016 17:25
quelle
3

Sie können Ihre eigene Methode mit map definieren, um den Typ zu erweitern:

%Vor%     
Jean Logeart 01.09.2016 17:44
quelle
2

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.

    
Kylar 01.09.2016 17:26
quelle

Tags und Links