Общий тип Java, преобразованный в Scala, не принимает сам суперкласс

Я пишу рамки. Интерфейсы написаны и скомпилированы в коде Java. Клиент использует Scala и эти интерфейсы. Вот пример интерфейса.

public interface Context {
   MyComponent<? extends File> getComponent();
}

Теперь мой Scala-код использует интерфейс следующим образом.

val component = context.getComponent();
println(calculate(component));

def calculate( component: MyComponent[File] ): Unit = ???

Компилятор Scala выдает ошибки в строке 2 для println(calculate(component)), Ошибка: Несоответствующий тип, ожидаемый: MyComponent[Файл], фактический: MyComponent[_ <: Файл].

1 ответ

Решение

Подстановочный тип Java

? extends File

соответствует экзистенциальному типу

_ <: File

в Скале. Попробуйте сменить подпись

def calculate(component: MyComponent[File]): Unit = ???

в

def calculate(component: MyComponent[_ <: File]): Unit = ???

Также обратите внимание, что если MyComponent был Scala-класс, который находится под вашим контролем, затем изменил параметр инвариантного типа на параметр ковариантного типа +F может также работать, потому что тогда каждый MyComponent[F] forSome { type F <: File } будет частным случаем MyComponent[File],

Другие вопросы по тегам