O que significa a palavra-chave out em Kotlin e como usá-la com genéricos?
Olá! Comecei a estudar Kotlin depois de Java e me deparei com uma construção que não entendo. Em Java, estou acostumado com genéricos usando wildcards como `? extends T` e `? super T`. Mas em Kotlin, vejo as palavras-chave `in` e `out` diretamente na declaração da classe.
Por exemplo, encontrei este código:
```kotlin
interface Source {
fun get(): T
}
```
O que significa `out` antes de `T`? Tentei escrever minha classe sem `out`:
```kotlin
class Box(private val item: T) {
fun get(): T = item
fun set(newItem: T) { /* ... */ }
}
```
E funciona. Mas se eu adicionar `out`, o compilador reclama do método `set`. Por quê? E para que serve `out`? Em quais situações devo usá-lo? Como isso se relaciona com o princípio PECS (Producer Extends, Consumer Super) do Java? Explique, por favor, com exemplos simples para que eu entenda quando e por que usar `out` em Kotlin.
<<>>
O que é out em Kotlin: declaração de variância (declaration-site variance)
A palavra