Pregunta

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 ; éxito principal de Google para mi pregunta :

  

MO: El diseño comodín original ... se inspiró en tipos existenciales. De hecho, el documento 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

¿Fue útil?

Solución

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

  

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

Entonces parece que los tipos existenciales de Scala y los comodines de Java son equivalentes

Otros consejos

Se supone que son equivalentes, ya que su objetivo 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 estar limitado tanto por arriba como por abajo, mientras que el comodín de Java solo puede estar unido en la parte superior.

Por ejemplo, en Scala:

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

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

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

  

Scala necesita tipos existenciales para esencialmente tres cosas. El primero   es que tenemos que entender los comodines de Java, y   tipos existenciales es el sentido que les damos. El segundo es que nosotros   necesitan tener algún sentido de los tipos sin formato de Java, porque también son   Todavía en las bibliotecas, los tipos no genéricos. Si obtienes un Java sin procesar   tipo, como java.util.List, es una lista donde no conoce el   tipo de elemento. Eso también se puede representar en Scala por un existencial   tipo. Finalmente, necesitamos tipos existenciales como una forma de explicar lo que sucede   en la VM en el alto nivel de Scala. Scala usa el modelo de borrado   de genéricos, al igual que Java, por lo que no vemos los parámetros de tipo   más cuando se ejecutan programas. Tenemos que borrar porque necesitamos   para interoperar con Java. Pero entonces, ¿qué pasa cuando hacemos reflexión?   o quieres expresar lo que ocurre en la VM? Necesitamos poder   representar lo que hace la JVM usando los tipos que tenemos en Scala, y   los tipos existenciales nos permiten hacer eso. Te dejan hablar sobre tipos donde   no conoces ciertos aspectos de esos tipos.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top