Si vienes de Java, probablemente List<?> te resulte familiar. En Scala 3 existe exactamente la misma idea, pero con una sintaxis más simple:
List[?]
El ? representa un tipo desconocido.
No significa "cualquier objeto" (Any), sino "existe algún tipo, pero no sabemos cuál".
Por ejemplo:
val xs: List[?] = List(1, 2, 3)
val ys: List[?] = List("Scala", "Java")
Ambas asignaciones son válidas porque el tipo concreto de los elementos queda oculto.
¿Qué puedo hacer con un List[?]?
Como el compilador desconoce el tipo de los elementos, solo permite las operaciones que son seguras para cualquier tipo.
val xs: List[?] = List(1, 2, 3)
xs.size // ✅
xs.isEmpty // ✅
xs.head // Devuelve Any
Pero no es posible asumir que los elementos son de un tipo específico.
val n: Int = xs.head // ❌ No compila
¿Es lo mismo que List[Any]?
No.
List[Any] es una lista cuyos elementos son de tipo Any. En cambio, List[?] es una lista cuyo tipo de elemento es desconocido.
La diferencia es importante. Una List[String] puede verse como List[?] porque simplemente ocultamos el tipo. No ocurre lo mismo con todos los genéricos respecto de Any, especialmente si son invariantes.
¿Por qué existe?
El wildcard permite escribir APIs cuando el tipo concreto no importa.
Si un método solo necesita recorrer una colección, conocer su tamaño o pasarla a otro método, expresar List[?] comunica mucho mejor la intención que usar Any o un parámetro de tipo innecesario.
En definitiva, ? no significa "cualquier tipo". Significa algo mucho más preciso: "Existe un tipo, pero no necesito saber cuál."
Es una pequeña diferencia sintáctica, pero una gran diferencia semántica.

No hay comentarios.:
Publicar un comentario