El parámetro de tipo covariante en scala debe ser invariante en la interfaz java
Tengo un rasgo que se ve así (puede encontrar más información enesta pregunta relacionada por mí mismo aunque no lo creo, es necesario para esta pregunta)
trait Extractor[-A,+B] {
def extract(d:A):B
//lots of other things
}
Para usar esto en un marco java existente, me gustaría estoExtractor
para tener una función que devuelve unComparator[B]
(siendojava.util.Comparator) o incluso mejor extenderComparator[A]
. Ahora eso plantea un problema porqueComparator
El parámetro de tipo s debe ser invariante, mientras queA
es contravariante yB
es covariante
Entonces obtengo errores como este:
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]
^
¿Ves alguna forma de salir de esto o es solo uno de esos casos en los que "usar los genéricos de Java en scala duele"?