Domanda

Un po 'più specifico della domanda Stack Overflow Che cos'è un tipo esistenziale? , qual è la differenza tra i tipi esistenziali di Scala e il carattere jolly di Java, preferibilmente con qualche esempio illustrativo?

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

Alcuni riferimenti. Martin Odersky le menziona ; Il il maggior successo di Google per la mia domanda :

  

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

È stato utile?

Soluzione

Questa è la risposta di Martin Odersky nella mailing list degli utenti di Scala:

  

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

Quindi sembra che i tipi esistenziali Scala e i caratteri jolly Java siano un po 'equivalenti

Altri suggerimenti

Dovrebbero essere equivalenti, poiché il loro scopo principale è interagire con i caratteri jolly di Java.

Sono molto simili ma il tipo esistenziale di Scala dovrebbe essere più potente. Ad esempio, il tipo esistenziale di Scala può essere sia superiore che inferiore, mentre il carattere jolly di Java può essere solo legato in modo superiore.

Ad esempio, in Scala:

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

il foo prende un elenco di parametri che ha un limite inferiore di Int.

Una risposta molto più dettagliata di Martin Odersky (il resto può essere trovato qui ):

  

Scala ha bisogno di tipi esistenziali essenzialmente per tre cose. Il primo   è che dobbiamo dare un senso ai caratteri jolly di Java e   tipi esistenziali è il senso che ne facciamo. Il secondo è che noi   bisogno di dare un senso ai tipi grezzi di Java, perché anche loro lo sono   ancora nelle librerie, i tipi non generati. Se ottieni un Java grezzo   tipo, come java.util.List è un elenco in cui non si conosce il file   tipo di elemento. Ciò può anche essere rappresentato in Scala da un esistenziale   genere. Infine, abbiamo bisogno di tipi esistenziali come modo per spiegare cosa succede   nella VM ad alto livello di Scala. Scala utilizza il modello di cancellazione   di generici, proprio come Java, quindi non vediamo i parametri di tipo   più quando i programmi sono in esecuzione. Dobbiamo cancellare perché ne abbiamo bisogno   per interagire con Java. Ma poi cosa succede quando facciamo la riflessione   o vuoi esprimere ciò che accade nella VM? Dobbiamo essere in grado di   rappresentano ciò che fa la JVM usando i tipi che abbiamo in Scala e   i tipi esistenziali ci permettono di farlo. Ti permettono di parlare di tipi in cui   non conosci alcuni aspetti di questi tipi.

La notazione List [_] (che come indicano altre risposte è un analogo più potente dell'elenco Java [?] ) è un caso degenerato di nozione più generale di un tipo esistenziale in Scala.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top