Covariant Typeparameter in Scala muss in Java-Schnittstelle invariant sein
Ich habe eine Eigenschaft, die so aussieht (weitere Informationen finden Sie unterdiese verwandte Frage von mir selbst obwohl ich nicht denke, wird es für diese Frage benötigt)
trait Extractor[-A,+B] {
def extract(d:A):B
//lots of other things
}
Um dies in einem vorhandenen Java-Framework zu verwenden, möchte ich diesExtractor
, um entweder eine Funktion zu haben, die ein @ zurückgiComparator[B]
(Sein java.util.Comparator) oder noch besser verlängernComparator[A]
. Das ist ein Problem, weilComparator
s Typparameter sollte unveränderlich sein, währendA
ist kontravariant undB
ist kovariant.
So bekomme ich Fehler wie diesen:
scala> import java.util.Comparator
import java.util.Comparator
scala> trait Extractor[-A,+B] extends Comparator[A]
<console>:6: error: contravariant type A occurs in invariant position in type [-A,+B]java.lang.Object with java.util.Comparator[A] of trait Extractor
trait Extractor[-A,+B] extends Comparator[A]
^
scala> trait Extractor[-A, +B] {
| def comp:Comparator[B]
| }
<console>:7: error: covariant type B occurs in invariant position in type => java.util.Comparator[B] of method comp
def comp:Comparator[B]
^
Sehen Sie einen Ausweg oder ist dies nur einer dieser Fälle, in denen "die Verwendung von Java-Generika in Scala schmerzt"?