Ich möchte alle Iterable
s mit einigen benutzerdefinierten Code zu verbessern. Dazu schrieb ich folgendes:Implizite Klasse für Untertypen einer generischen Klasse
implicit class RichIterable[A, B <: Iterable[A]](b: B) {
def nonEmptyOpt: Option[B] = if (b.nonEmpty) Some(b) else None
}
Nun, wenn ich diese Methode auf einem List
verwenden möchten, die auf jeden Fall eine Unterklasse von Iterable
wie
List(1, 2, 3).nonEmptyOpt
ich
value nonEmptyOpt is not a member of List[Int]
so ist
Wie kann ich das beheben?
neugierig Just, ist alles verloren/geändert von "existentiell" geht? 'RichIterable [A, B [_] <: Iterable [_]] (b: B [A]) {...' – jwvh
@jwvh Dies verliert den exacta-Rückgabetyp für alle Unterklassen, die nicht genau einen Typparameter haben , das ist das gleiche wie im 'Iterable', das sie ausdehnen. Einige Beispiele dafür sind 'Map [A, B]' oder 'scala.xml.NodeSeq'. ZB 'Map (1-> 2) .nonEmptyOpt' wird' Option [Iterable [...]] 'sein, nicht' Option [Map [...]] ' – Kolmar
@Kolmar, ich gehe zurück und weiter zwischen 'B [X] ...' und 'B [_] ...', und bis jetzt konnte ich keinen Unterschied in der Handhabung von 'Map()' feststellen. – jwvh