O parâmetro Covariant Type no scala precisa ser invariante na interface java
Eu tenho uma característica que se parece com isso (algumas informações adicionais podem ser encontradas emesta pergunta relacionada por mim embora eu não pense, é necessário para esta pergunta)
trait Extractor[-A,+B] {
def extract(d:A):B
//lots of other things
}
Para usar isso em uma estrutura java existente, eu gostaria dissoExtractor
ter uma função que retorne umComparator[B]
(serjava.util.Comparator) ou ainda melhorComparator[A]
. Agora, isso representa um problema porqueComparator
O parâmetro s type deve ser invariável, enquantoA
é contravariante eB
é covariante.
Então, eu recebo erros 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]
^
Você vê alguma saída disso ou é apenas um daqueles casos em que "o uso de genéricos java no scala dói"?