2009-06-23 10 views
29

Un po 'più specifico di Stack Overflow questione What is an existential type?, qual è la differenza tra tipi esistenziali di Scala e jolly di Java, prefereably con qualche esempio illustrativo?Differenza tra i tipi esistenziali di Scala e il jolly di Java con l'esempio?

In tutto ciò che ho visto finora, sembrano essere abbastanza equivalenti.

Alcuni riferimenti. Martin Odersky mentions them; top hit for my question di Google:

MO: Il design originale jolly ... è stato ispirato da tipi esistenziali. In effetti il ​​documento originale aveva una codifica in tipi esistenziali. Ma quando il vero progetto finale è uscito in Java, questa connessione è andata persa un po '

+0

imho, fotNelton sembra fare alcune aggiunte rilevanti omesse dagli altri, il che sarebbe interessante sapere di più. Sarebbe interessante avere la seconda metà della citazione spiegata più chiaramente ... – ib84

risposta

13

Questa è la risposta di Martin Odersky sulla Scala-users mailing list:

I tipi Java jolly originali (come descritto nel documento ECOOP da Igarashi e Viroli) erano infatti solo delle abbreviazioni per esistenziali tipi. Mi è stato detto e ho letto nel documento di FOOL '05 su Wild FJ che la versione finale dei caratteri jolly presenta alcune sottili differenze con i tipi di tipo . Non saprei esattamente in che senso (il loro formalismo è troppo lontano dai classici tipi esistenziali per essere in grado di individuare la differenza), ma forse una lettura attenta del documento Wild FJ farebbe luce su di esso.

Così sembra che Scala tipi esistenziali e caratteri jolly Java sono tipo-di equivalente

+2

Un collegamento all'intera conversazione sarebbe più utile –

+0

Non c'era molto altro oltre a questo –

6

Si suppone che siano equivalenti, poiché il loro scopo principale è l'interazione con i caratteri jolly di Java.

+0

Ho aggiunto il commento di Martin Odersky alla mia domanda iniziale. Leggendo la sua risposta a Bill Venners, sembra che i tipi esistenziali non siano equivalenti ai caratteri jolly. Certamente, sono abbastanza sicuro di aver letto qualcosa di molto indietro, essenzialmente soffiando il fatto che Scala * non * avente tipi di caratteri jolly (come in origine non lo era) era una cosa positiva. –

+0

Qualcuno mi ha fatto notare che probabilmente stava sbuffando il fatto che Scala non ha * tipi * raw * –

+0

@oxbow_lakes, 'Lista [_]' è considerata una lista non elaborata in Scala? –

6

Essi sono molto simili, ma di tipo esistenziale di Scala si suppone che sia più potente. Ad esempio, il tipo esistenziale di Scala può essere sia superiore che inferiore, mentre il carattere jolly di Java può essere solo superiore.

Per esempio, in Scala:

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

foo prende una lista di parametro che ha un limite inferiore di Int.

4

Un modo risposta più dettagliata da Martin Odersky (il resto può essere trovato here):

Scala ha bisogno di tipi esistenziali per essenzialmente tre cose. Il primo è che abbiamo bisogno di dare un senso ai caratteri jolly di Java, e i tipi esistenziali è il senso che ne facciamo. Il secondo è che noi abbiamo bisogno di dare un senso ai tipi grezzi di Java, perché sono anche ancora nelle librerie, i tipi non generati. Se si ottiene un tipo Java raw , ad esempio java.util.List, si tratta di un elenco in cui non si conosce il tipo di elemento . Ciò può anche essere rappresentato in Scala da un tipo esistenziale .Infine, abbiamo bisogno di tipi esistenziali come modo per spiegare cosa succede nella nella VM ad alto livello di Scala. Scala usa il modello di cancellazione di generici, proprio come Java, quindi non vediamo più i parametri di tipo durante l'esecuzione dei programmi. Dobbiamo cancellare perché abbiamo bisogno di per interoperare con Java. Ma allora cosa succede quando facciamo la riflessione o vuoi esprimere cosa succede nella VM? Dobbiamo essere in grado di rappresentare ciò che la JVM fa usando i tipi che abbiamo in Scala, e i tipi esistenziali permettono di farlo. Ti lasciano parlare di tipi in cui non conosci certi aspetti di questi tipi.

0

Il List[_] notazione (che, come altre risposte sottolineano è un più potente analogico a Java di List[?]) è un caso degenere della more general notion di tipo esistenziale in Scala.

Problemi correlati