La differenza tra i tipi esistenziali di Scala e il jolly di Java per esempio?
-
06-07-2019 - |
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 '
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.