Общий тип 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]
,