Это ошибка ключевого слова kotlin 'in'? - PullRequest
1 голос
/ 18 октября 2019

Посмотрите на следующий код. Почему нет предупреждения в строке 2, и я могу запустить его без каких-либо ошибок?

fun main() {
    val testProducer: TestProducer<in Child> = TestProducer(22)
    println(testProducer.get())
}

open class Parent

class Child : Parent()

class TestProducer<T>(private val data: T) {
    fun get(): T = data
}

1 Ответ

1 голос
/ 18 октября 2019

Нет, это не ошибка.

in Ключевое слово: делает параметр типа контравариантным : его можно использовать только и никогда не создавать.

Возможно, вы запутались из-за другого общего использования ключевого слова in - внутри цикла.

Вот все места, где можно использовать ключевое слово in:

  • указывает, что объект, повторяемый в цикле for
  • используется в качестве инфиксного оператора для проверки того, что значение принадлежит диапазону, коллекции или другому объекту, который определяет метод содержимого
  • используется, когда выражения для той же цели
  • помечает параметр типа как контравариантный

Ссылки - generics , ключевое слово-reference

Edit 1:

Как уже упоминалось в комментарии, <in Child> означает, что вы можете передавать дочерние объекты в качестве параметров функции. Но когда он возвращает объекты, как в вашей функции get(), они обрабатываются так, как будто они Any?. Ваш код работает, потому что println принимает Any? в качестве параметра.

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