Почему тип возвращаемых методов-производителей в проецируемых типах generi c с верхней границей равен Any? вместо типа верхней границы? - PullRequest
1 голос
/ 15 апреля 2020

Рассмотрим эту настройку:

open class Base
open class Derived: Base()

interface Foo<T: Base> {
    fun produce(): T
    fun consume(aT: T)
}

Допустимы следующие функции:

fun apply1(f: Foo<*>) {
    val p: Base = f.produce();
}

fun apply2(f: Foo<Derived>) {
    val p: Base = f.produce();
}

, но это не так:

fun apply3(f: Foo<in Derived>) {
    val p: Base = f.produce();
}

Несоответствие типов
Обязательно: База
Найдено: Любое?

Тип c параметр типа T имеет верхнюю границу. Так что его можно смело рассматривать как подтип Base, как это сделано в apply1 и apply2. Вопрос в том, почему нельзя делать то же самое, когда проецируется с in?

1 Ответ

0 голосов
/ 16 апреля 2020

Эти ключевые слова предназначены для ограничения, вы указываете его, когда хотите убедиться, что ваш пользователь не будет читать и записывать значения из объекта. Fl aws, которых он пытается избежать, объясняется в Kotlin официальной документации (дисперсия + проекция типа).

Ключевое слово in допускает только потребление по аннотированной цели, а из единицы - для производства значений. Ваша функция apply3 должна использовать ключевое слово out , чтобы указать, что целью является получение только значений из параметра foo.

Напротив, in накладывает ограничение, указывающее, что вы дадите Foo объектов для потребления, и только для .

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