Implementierung Left#mapRight und Right#mapLeft

@Landei : die Implementierung von Left#mapRight und Right#mapLeft haben mich verwundert.

Weshalb @Override public <B1> Either<A, B1> mapRight(Function<? super B, ? extends B1> fn) { return left(getLeft()); } und nicht einfach @Override public <B1> Either<A, B1> mapRight(Function<? super B, ? extends B1> fn) { return this; }

Ich hätte es ja einfach geändert - aber das sieht zu gewollt aus um übersehen zu sein.

this ist ein Left<A,B> und benötigt wird ein Left<A,B1> (was der Compiler bei mir auch anmeckert). Ich denke ein Cast **sollte **hier eigentlich ungefährlich sein, aber meine Variante erschien mir einen Tick sicherer.

Was ist, wenn jemand wirklich auf die Referenz geht, etwas als Key in einer IdentityHashMap? Dann wundert er sich, wie sein alter Left<String,Integer>-Eintrag von einem Left<String,Date>-Eintrag überschrieben werden konnte. Sicher etwas weit hergeholt, aber möglich. Andererseits kann das equals in Left “dank” Type-Erasure auch nicht zwischen den beiden Varianten unterscheiden, eine “normale” Map würde sich also auch so verhalten.

Hatte den Cast gestern eingefügt.