web-dev-qa-db-fra.com

Impossible d'instancier le type Set

J'essaie de créer un ensemble de chaînes qui est rempli avec les clés d'une table de hachage afin qu'une boucle pour chaque puisse itérer à travers l'ensemble et mettre les valeurs par défaut dans une table de hachage. J'apprends toujours Java mais la façon dont j'essaie de le faire n'est pas une syntaxe valide. Quelqu'un pourrait-il s'il vous plaît montrer la bonne façon de le faire et expliquer pourquoi ma manière ne fonctionne pas et la leur Est-ce que.

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));
        }
    }
}
21
John Tate

Set n'est pas une classe, c'est une interface.

Donc, fondamentalement, vous ne pouvez instancier que la classe implémentant Set (HashSet, LinkedHashSet ou TreeSet)

Par exemple :

Set<String> mySet = new HashSet<String>();
54
SegFault

Set est une interface. Vous ne pouvez pas instancier une interface, uniquement les classes qui implémentent cette interface.

L'interface spécifie le comportement et ce comportement peut être implémenté de différentes manières par différents types. Si vous y pensez comme ça, cela n'a aucun sens d'instancier une interface, car il spécifie ce qu'une chose doit faire, pas comment elle le fait.

1
Aaron

La méthode keySet() de HashMap crée déjà l'ensemble dont vous avez besoin, alors simplement:

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

C'est un vue des clés par défaut, donc son contenu changera lorsque des modifications seront apportées à la carte sous-jacente (defaults). Les modifications apportées à keys seront également reflétées dans la carte, mais vous pouvez uniquement supprimer ... pas ajouter ... des clés de la carte.

Si vous avez besoin d'une copie des clés qui n'interagit pas avec la carte d'origine, utilisez l'un des types suggérés, comme dans:

Set<String> keys = new HashSet( defaults.keySet() );
0
Mike Housky