2013-02-14 4 views
5

In JDK 1.7 È possibile creare un Collection per, ad es. dire una HashMap come questo:Creazione di una mappa attraverso una classe anonima con <>

private HashMap<String, String> map = new HashMap<>(); 

Con il diamante <> alla fine.

Ma se io sono la creazione di una mappa come questa:

private static final HashMap<String, String> MAP = new HashMap<>() {{ 
    put("something", "something"); 
}}; 

dal compilatore diamante dice che:

Cannot use ''<>'' with anonymous inner classes 

devo usare: ... new HashMap<String, String>() {{.... per il codice per la compilazione.

Perché è così? Perché posso creare una mappa e usare diamond se sto creando solo una nuova istanza ma il codice non viene compilato se sto creando una mappa attraverso una classe anonima?

+0

Scoperta interessante. Curioso me stesso. –

+2

Non penso che sia duplicato - questa domanda sta chiedendo PERCHÉ. Le risposte all'altra domanda non dicono veramente perché Sun ha preso quella decisione, solo che non puoi farlo. –

+0

@MrSpoon è in realtà la decisione di Oracle, non di Sun.: P – PermGenError

risposta

2

questa è solo una supposizione, ma quando lo fai

new HashMap<>() {{ 
    put("something", "something"); 
}}; 

E 'in realtà crea una sottoclasse di HashMap Non mi piace questo perché si sporchi le vostre classi con un mazzo di sottoclassi. In questo caso, suppongo che Java non possa dedurre quale sia il tipo di diamante generico perché viene sottoposto a sottoclassi.

+3

ma penso che la domanda OP si stia chiedendo è * perché * Java non è in grado di dedurlo in questo caso? –

+0

@mattb * In realtà crea una sottoclasse di 'HashMap' * –

+0

Sì, ma come già detto su http://stackoverflow.com/questions/9773733/double-brace-initialisation-anonymous-inner-class-with-diamond-operator è anche a causa della sottoclasse. Questa domanda non ha una risposta né al perché, però. –