Вывод типа не выполняется для параметризованных типов - PullRequest
0 голосов
/ 04 мая 2019

Скажем, у нас есть следующие типы:

abstract class Generic_B

interface Generic_A<Generic_B>

class Concrete_B : Generic_B()

class Concrete_A : Generic_A<Concrete_B>

fun main(args: Array<String>) {
    val a = Concrete_A();
    foo(a);
}

fun foo(thing: Generic_A<Generic_B>) {
}

Я получаю сообщение об ошибке:

Error:(27, 9) Kotlin: Type mismatch: inferred type is Concrete_A but Generic_A<Generic_B> was expected

Я не совсем понимаю ошибку.

Concrete_A является экземпляром Generic_A и параметризован для конкретного экземпляра Generic_B. Поэтому я чувствую, что вывод типа должен совпадать.

Я думаю, у меня следующие вопросы:

  1. Почему вывод типа не работает? (это случай более высокого родственного полиморфизма?)
  2. Как мне обойти это?

1 Ответ

4 голосов
/ 04 мая 2019

По сути, вы просто столкнулись с проблемой, что Generic_A<Generic_B> - это не то же самое, что Generic_A<Concrete_B>, что расширяет Concrete_A.

Если вы добавите дисперсию out к общей части параметра thing, она будет работать, так как она будет принимать все подтипы Generic_B:

fun foo(thing: Generic_A<out Generic_B>) {
}
...