Kotlin – ключевое слово «in» – для чего используется?

Я пытаюсь понять, когда использовать ключевое слово «in» в generics в отличие от ключевого слова «out» (что позволяет назначать подклассы).

Я действительно следую этому руководству, если это имеет значение.

Допустим, у нас есть следующий класс defintiion:

class ParameterizedConsumer<in T> { fun toString(value: T): String { return value.toString() } } 

Как это даже компилируется, поскольку значение не гарантируется как String? это то, что делает ключевое слово? он говорит классу, что есть гарантия, что тип не будет каким-либо другим подклассом? Я просто не понимаю, как это сделать, не могли бы вы помочь?

в учебнике говорится, что я смогу вызвать следующее, но я потерял то, что он изменил:

  val parameterizedConsumer = ParameterizedConsumer<Number>() val ref: ParameterizedConsumer<Double> = parameterizedConsumer assertTrue(ref is ParameterizedConsumer<Double>) 

ОБНОВЛЕНИЕ: Я понял это сейчас. Out означает, что вы можете подавлять при создании. и «В» означает, что вы можете подавлять при назначении.

Так что в java это не разрешено:

 // Java void demo(Source<String> strs) { Source<Object> objects = strs; // !!! Not allowed in Java // ... } 

но в kotlin мы можем исправить это, если мы используем ключевое слово «out», которое мы можем назначить классу downcasted (подкласс). аналогично «in», мы можем переходить в подкласс внутри класса, чтобы использовать его, но не внешне.

он говорит классу, что есть гарантия, что тип не будет каким-либо другим подклассом? Я просто не понимаю, как это сделать, не могли бы вы помочь?

Скажем, у вас есть функция, которая хочет добавить некоторые элементы в список, который вы поставляете. Элементы имеют тип Int .

Вопрос: какие списки подходят для этой функции?

Ответ: MutableList<Int> , MutableList<Number> , MutableList<Any> . Или, короче говоря, MutableList<in Int> .

Я отвечу на часть вашего вопроса

Как это даже компилируется, поскольку значение не гарантируется как строка

И что? Вы можете вызвать .toString() для любого типа. Вот как вы получите строку, которую вы будете возвращать.