2013-09-22 27 views
18

Próbuję utworzyć zestaw ciągów znaków, który jest wypełniony klawiszami z tablicy kontrolnej, tak aby pętla for mogła przeglądać zestaw i umieszczać wartości domyślne w tablicy kontrolnej. Nadal uczę się języka Java, ale sposób, w jaki próbuję to zrobić, to nieprawidłowa składnia. Czy ktoś mógłby zademonstrować właściwy sposób robienia tego i wyjaśnić, dlaczego moja droga nie działa, a czynią to?Nie można utworzyć instancji typu 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

powinno być 'new HashSet ();' –

+0

Hashtable jest w większości przestarzała - powinieneś raczej używać HashMap. – assylias

+0

możliwy duplikat [Nie można utworzyć listy typu ] (http://stackoverflow.com/questions/7960149/cannot-instantiate-the-type-listproduct) – Raedwald

Odpowiedz

40

Set nie jest klasą, jest interfejsem.

Więc w zasadzie można instancji tylko klasę wykonawczą Set (HashSet, LinkedHashSet lub TreeSet)

Na przykład:

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

Z tym że nie chciałbyś używać surowych typów ... –

+1

Ach, jaki błąd popełniłem przez debiutanta. –

1

Ustaw jest interfejs. Nie można utworzyć instancji interfejsu, tylko klasy, które implementują ten interfejs.

Interfejs określa zachowanie, a zachowanie to może być realizowane na różne sposoby według różnych typów. Jeśli myślisz o tym w ten sposób, nie ma sensu tworzenie interfejsu, ponieważ określa on, co musi zrobić, a nie jak to robi.

0

keySet() metoda HashMap już tworzy zestaw trzeba, więc po prostu:

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

To widok z kluczami w domyślnych, więc jej zawartość ulegnie zmianie po wprowadzeniu zmian do instrumentu bazowego (defaults) mapę. Zmiany wprowadzone do keys będą również widoczne na mapie, ale możesz usunąć tylko ... nie dodawać ... kluczy z mapy.

Jeśli potrzebujesz kopie kluczy, które nie wchodzi w interakcje z oryginalnej mapy, a następnie użyć jednego z typów zasugerował, jak w:

Set<String> keys = new HashSet(defaults.keySet()); 
Powiązane problemy