java scala type-systems bounded-wildcard existential-type

¿Diferencia entre los tipos existenciales de Scala y el comodín de Java por ejemplo?



type-systems bounded-wildcard (5)

Esta es la respuesta de Martin Odersky en la lista de correo de los usuarios de Scala:

Los tipos de comodín de Java originales (como se describe en el documento ECOOP de Igarashi y Viroli) eran, de hecho, solo taquigrafías para tipos existenciales. Me han dicho y he leído en el artículo de FOOL ''05 sobre Wild FJ que la versión final de los comodines tiene algunas diferencias sutiles con los tipos existenciales. No sabría exactamente en qué sentido (su formalismo está demasiado alejado de los tipos existenciales clásicos para poder identificar la diferencia), pero tal vez una lectura cuidadosa del documento Wild FJ arrojaría algo de luz sobre él.

Parece que los tipos existenciales de Scala y los comodines de Java son equivalentes

Un poco más específico que la pregunta de desbordamiento de pila ¿ Qué es un tipo existencial? , ¿cuál es la diferencia entre los tipos existenciales de Scala y el comodín de Java, preferiblemente con algún ejemplo ilustrativo?

En todo lo que he visto hasta ahora, parecen ser bastante equivalentes.

Algunas referencias. Martin Odersky los menciona ; El mayor éxito de Google para mi pregunta :

MO: El diseño de comodín original ... se inspiró en tipos existenciales. De hecho, el papel original tenía una codificación en tipos existenciales. Pero luego, cuando el diseño final real salió en Java, esta conexión se perdió un poco.


La notación de la List[_] (que, como señalan otras respuestas, es un análogo más potente de la List[?] de Java List[?] ) Es un caso degenerado de la noción más general de un tipo existencial en Scala.


Se supone que son equivalentes, ya que su propósito principal es interactuar con los comodines de Java.


Son muy similares, pero se supone que el tipo existencial de Scala es más poderoso. Por ejemplo, el tipo existencial de Scala puede ser tanto el límite superior como el inferior, mientras que el comodín de Java solo puede ser un enlace superior.

Por ejemplo, en Scala:

scala> def foo(x : List[_ >: Int]) = x foo: (x: List[_ >: Int])List[Any]

foo toma una lista de parámetros que tiene un límite inferior de Int.


Una respuesta más detallada por Martin Odersky (el resto se puede encontrar aquí ):

Scala necesita tipos existenciales para esencialmente tres cosas. La primera es que tenemos que tener algún sentido de los comodines de Java, y los tipos existenciales es el sentido que tenemos de ellos. La segunda es que tenemos que dar una idea de los tipos en bruto de Java, porque también están todavía en las bibliotecas, los tipos no generados. Si obtiene un tipo en bruto de Java, como java.util.List, es una lista en la que no conoce el tipo de elemento. Eso también puede ser representado en Scala por un tipo existencial. Finalmente, necesitamos tipos existenciales como una forma de explicar lo que sucede en la máquina virtual en el alto nivel de Scala. Scala usa el modelo de borrado de genéricos, al igual que Java, por lo que ya no vemos los parámetros de tipo cuando se ejecutan los programas. Tenemos que hacer el borrado porque necesitamos interoperar con Java. Pero entonces, ¿qué sucede cuando hacemos una reflexión o queremos expresar lo que ocurre en la máquina virtual? Necesitamos poder representar lo que hace la JVM utilizando los tipos que tenemos en Scala, y los tipos existenciales nos permiten hacerlo. Le permiten hablar sobre tipos en los que no conoce ciertos aspectos de esos tipos.