У меня есть черта, которая выглядит следующим образом (некоторая дополнительная информация может быть найдена в этом связанном мне вопросе, хотя я не думаю, что это необходимо для этот вопрос)
trait Extractor[-A,+B] {
def extract(d:A):B
//lots of other things
}
Чтобы использовать это в существующей java-структуре, я хотел бы, чтобы этот Extractor
имел либо функцию, которая возвращает Comparator[B]
(будучи java.util.Comparator) или даже лучше расширить Comparator[A]
. Теперь возникает проблема, потому что параметр типа Comparator
должен быть инвариантным, а A
является контравариантным и B
является ковариантным.
Итак, я получаю такие ошибки:
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]
^
Вы видите какой-либо выход из этого или это только один из тех случаев, когда "использование дженериков java в scala болит"?