Параметр ковариантного типа в scala должен быть инвариантным в интерфейсе java.

У меня есть черта, которая выглядит вот так (дополнительную информацию можно нашел на этот связанный вопрос сам , хотя я не думаю, что он нужен для этого вопроса)

trait Extractor[-A,+B] {
  def extract(d:A):B
  //lots of other things
}

Чтобы использовать это в существующей среде Java, я бы хотел, чтобы этот Extractor либо есть функция, которая возвращает Comparator [B] (являющийся java.util. Компаратор ) или еще лучше расширить Компаратор [A] . Теперь это создает проблему, потому что параметр типа Comparator должен быть инвариантным, в то время как A контравариантен, а B ковариантен.

Итак, я получаю ошибки вот так:

scala> import java.util.Comparator
import java.util.Comparator

scala> trait Extractor[-A,+B] extends Comparator[A]
: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]
     | }
:7: error: covariant type B occurs in invariant position in type => java.util.Comparator[B] of method comp
         def comp:Comparator[B]
             ^

Видите ли вы выход из этого, или это лишь один из тех случаев, когда «использование java-дженериков в scala вредно»?

12
задан Community 23 May 2017 в 11:48
поделиться