2013-09-22 19 views
18

Sto cercando di creare un insieme di stringhe che viene riempito con le chiavi da un Hashtable quindi una for-each ciclo grado di scorrere il set e mettere le impostazioni predefinite in una Hashtable. Sto ancora imparando Java, ma il modo in cui sto cercando di farlo non è una sintassi valida. Qualcuno potrebbe dimostrare il modo corretto di farlo e spiegare perché il mio modo non funziona e il loro modo di farlo.Impossibile istanziare il tipo di set

private Hashtable<String, String> defaultConfig() { 
    Hashtable<String, String> tbl = new Hashtable<String, String>(); 
    tbl.put("nginx-servers","/etc/nginx/servers"); 
    tbl.put("fpm-servers","/etc/fpm/"); 
    tbl.put("fpm-portavail","9001"); 
    tbl.put("webalizer-script","/usr/local/bin/webalizer.sh"); 
    tbl.put("sys-useradd","/sbin/useradd"); 
    tbl.put("sys-nginx","/usr/sbin/nginx"); 
    tbl.put("sys-fpmrc","/etc/rc.d/php_fpm"); 
    tbl.put("www-sites","/var/www/sites/"); 
    tbl.put("www-group","www"); 
    return tbl; 
} 

//This sets missing configuration options to their defaults. 
private void fixMissing(Hashtable<String, String> tbl) { 
    Hashtable<String, String> defaults = new Hashtable<String, String>(defaultConfig()); 
    //The part in error is below... 
    Set<String> keys = new Set<String>(defaults.keySet()); 

    for (String k : keys) { 
     if (!tbl.containsKey(k)) { 
      tbl.put(k, defaults.get(k)); 
     } 
    } 
} 
+0

dovrebbe essere 'nuovo HashSet ();' –

+0

Hashtable è per lo più obsoleto - in genere dovresti usare HashMap. – assylias

+0

possibile duplicato di [Impossibile istanziare il tipo Elenco ] (http://stackoverflow.com/questions/7960149/cannot-stasticiate-the-type-listproduct) – Raedwald

risposta

40

Set non è una classe, è un'interfaccia.

Quindi, in pratica è possibile creare un'istanza unica classe che implementa Set (HashSet, LinkedHashSet o TreeSet)

Per esempio:

Set<String> mySet = new HashSet<String>(); 
+0

Tranne che in realtà non vorresti usare i tipi grezzi ... –

+1

Ah, che errore da principiante ho commesso. –

1

Set è un'interfaccia. Non è possibile creare un'istanza di un'interfaccia, solo le classi che implementano tale interfaccia.

L'interfaccia specifica il comportamento, e che il comportamento può essere realizzato in modi diversi da diversi tipi. Se ci pensi in questo modo, non ha senso istanziare un'interfaccia perché sta specificando cosa deve fare una cosa, non come fa.

0

il metodo di HashMap keySet() crea già il set si ha bisogno, così semplicemente:

Set<String> keys = defaults.keySet(); 

Questa è una vista delle chiavi di default, quindi il suo contenuto cambieranno quando vengono apportate modifiche al sottostante (defaults) carta geografica. Le modifiche apportate a keys si rifletteranno anche sulla mappa, ma puoi rimuovere solo ... non aggiungere ... chiavi dalla mappa.

Se hai bisogno di una copia delle chiavi che non interagiscono con la mappa originale, quindi utilizzare uno dei tipi suggerito, come in:

Set<String> keys = new HashSet(defaults.keySet()); 
Problemi correlati