Общий тип Java, преобразованный в Scala, не принимает сам суперкласс - PullRequest
0 голосов
/ 22 мая 2018

Я пишу рамки.Интерфейсы написаны и скомпилированы в коде 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 [_ <: Файл]. </p>

1 Ответ

0 голосов
/ 22 мая 2018

Тип подстановочного знака Java

? extends File

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

_ <: File

в Scala.Попробуйте изменить сигнатуру

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

на

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...