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, weilComparators 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"?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage