2016-03-10 17 views
8

In questo libro, si dice:La limitazione di Arrays.asList() non è vero in Thinking in Java 4 ° Edizione

Una limitazione di Arrays.asList() è che ci vuole un'ipotesi migliore A proposito di il tipo risultante di Elenco e non si presta attenzione a ciò che si sta assegnando a .

Il libro è Thinking in Java di Bruce Eckel

Tuttavia, il seguente codice sta lavorando bene, al contrario di codice mostrato in questa pagina del libro 280

public class Main{ 

    public static void main(String[] args) { 
     List<Snow> snow = Arrays.asList(new Light(), new Heavy()); 
    } 
} 
class Snow {} 
class Powder extends Snow {} 
class Light extends Powder {} 
class Heavy extends Powder {} 

Java 1.8, IntelliJ , Windows 7 enter image description here

Qualsiasi pensiero è apprezzato.

+0

polvere, luce, classe pesante che acquisisce le proprietà della classe Snow, quindi, ovviamente, funziona bene – Ajinkya

+2

Due cose: prima, si sta recuperando qualcosa che è almeno conforme all'interfaccia 'Elenco', quindi non c'è nessun problema lì, e secondo , quale ti aspetteresti che fosse il problema? Niente qui salta subito fuori che questo è ovviamente gravemente sbagliato ... – Makoto

+0

@Makoto Ci dispiace, ho aggiornato la domanda. –

risposta

8

Questo codice non funziona in Java-7, ma è compilato in Java-8. Utilizzo di javac 7u80 Vedo:

Main.java:7: error: incompatible types 
       List<Snow> snow = Arrays.asList(new Light(), new Heavy()); 
              ^
    required: List<Snow> 
    found: List<Powder> 
1 error 

L'inferenza di tipo in Java-8 è stata notevolmente migliorata. Precedentemente il tipo veniva dedotto per ogni sottoespressione basata esclusivamente sull'analisi di quella sottoespressione, quindi il tipo di Arrays.asList(new Light(), new Heavy()) doveva essere conosciuto indipendentemente dal contesto circostante. In Java-8 il contesto circostante può rendere conto del tipo di espressione.

Nella specifica di linguaggio Java versione 8 c'è un whole new chapter dedicato all'inferenza di tipo. Non è molto facile da leggere, ma per la mia comprensione ora invece di assegnare il tipo concreto a ogni sottoespressione è stato assegnato un set di constraints. Nel nostro caso i vincoli sono Light <: T && Heavy <: T (nessun tipo esatto è dedotto qui). Successivamente viene eseguito il processo di riduzione che riduce l'insieme di vincoli all'insieme di limiti tenendo conto dello expression compatibility constraints.

+0

appriciato ma ti prego di spiegare un po 'più a fondo sul contesto circostante e sul tipo di espressione? –

+0

@VikrantKashyap Ho aggiunto alcune spiegazioni, ma per capire questo in dettaglio è necessario leggere le specifiche. –