¿Qué significa la palabra clave out en Kotlin y cómo usarla con genéricos?
¡Hola! Empecé a estudiar Kotlin después de Java y me encontré con una construcción que no entiendo. En Java estoy acostumbrado a los genéricos con wildcards como `? extends T` y `? super T`. Pero en Kotlin veo las palabras clave `in` y `out` directamente en la declaración de la clase.
Por ejemplo, me topé con este código:
```kotlin
interface Source {
fun get(): T
}
```
¿Qué significa `out` antes de `T`? Intenté escribir mi propia clase sin `out`:
```kotlin
class Box(private val item: T) {
fun get(): T = item
fun set(newItem: T) { /* ... */ }
}
```
Y funciona. Pero si agrego `out`, el compilador se queja del método `set`. ¿Por qué? ¿Y para qué sirve `out`? ¿En qué situaciones debería usarlo? ¿Cómo se relaciona esto con el principio PECS (Producer Extends, Consumer Super) de Java? Explíquenme, por favor, con ejemplos simples para que entienda cuándo y por qué usar `out` en Kotlin.
<<>>
Qué es out en Kotlin: declaración de varianza (declaration-site variance)
La palabra clave