2009-06-23 21 views
29

un poco más específica que la cuestión de desbordamiento de pila What is an existential type?, ¿cuál es la diferencia entre tipos existenciales de Scala y comodín de Java, prefereably con algún ejemplo ilustrativo?¿Diferencia entre los tipos existenciales de Scala y el comodín de Java por ejemplo?

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

Algunas referencias. Martin Odersky mentions them; top hit for my question de Google:

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

+0

imho, fotNelton parece hacer algunas adiciones relevantes omitidas por los otros, que sería interesante conocer más. Sería interesante tener la segunda mitad de la cita explicada más claramente ... – ib84

Respuesta

13

Esta es la respuesta de Martin Odersky en las Scala lista de distribución:

Los tipos de comodines de Java originales (como se describe en el documento ECOOP por Igarashi y Viroli) eran de hecho sólo abreviaturas de existenciales tipos. Me han dicho y he leído en el documento 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 formalismo está demasiado alejado de los tipos existenciales clásicos como para ser capaz de identificar la diferencia), pero tal vez una lectura cuidadosa del documento Wild FJ arroje algo de luz sobre él.

Por lo tanto, parece que la Scala tipos existenciales y comodines Java son una especie de equivalente

+2

Un enlace a toda la conversación sería muy útil –

+0

No había mucho más aparte de esto –

6

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

+0

He agregado el comentario de Martin Odersky a mi pregunta original. Al leer su respuesta a Bill Venners, parece que los tipos existenciales no son equivalentes a los comodines. Ciertamente, estoy bastante seguro de haber leído algo hace un tiempo esencialmente infundiendo que Scala * not * con tipos de comodines (como originalmente no) fue algo positivo. –

+0

Alguien me ha señalado que probablemente estaba resoplando el hecho de que Scala no tiene * raw * tipos –

+0

@oxbow_lakes, ¿'List [_]' se considera una lista sin formato en Scala? –

6

Son muy similares, pero de tipo existencial de Scala se supone que es más potente. 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] 

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

4

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

Scala necesita tipos existenciales de esencialmente tres cosas. El primer es que tenemos que tener algún sentido de los comodines de Java, y tipos existenciales es el sentido que tenemos de ellos. El segundo es que nosotros necesitamos tener algún sentido de los tipos brutos de Java, porque también están en las bibliotecas, los tipos no genéricos, . Si obtiene un tipo Java raw , como java.util.List, es una lista en la que no conoce el tipo de elemento . Eso también se puede representar en Scala por un tipo existencial .Finalmente, necesitamos tipos existenciales como una forma de explicar lo que va en la máquina virtual en el nivel alto de Scala. Scala utiliza el modelo de borrado de los genéricos, al igual que Java, por lo que ya no vemos los parámetros de tipo cuando se ejecutan los programas. Tenemos que borrarlo porque necesitamos para interoperar con Java. Pero entonces, ¿qué sucede cuando hacemos la reflexión o queremos expresar lo que sucede en la máquina virtual? Necesitamos poder representar lo que hace la JVM usando los tipos que tenemos en Scala, y tipos existenciales, vamos a hacer eso. Le permiten hablar sobre tipos donde no conoce ciertos aspectos de esos tipos.

0

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

Cuestiones relacionadas