web-dev-qa-db-ja.com

タイプセットをインスタンス化できません

For-eachループがセットを反復処理し、デフォルトをハッシュテーブルに入れることができるように、ハッシュテーブルからのキーで満たされたストリングのセットを作成しようとしています。私はまだ学んでいますJavaしかし、私がやろうとしている方法は有効な構文ではありません。します。

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はクラスではなく、インターフェイスです。

したがって、基本的には、SetHashSetLinkedHashSetまたはTreeSet)を実装するクラスのみをインスタンス化できます。

例えば ​​:

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

セットはインターフェースです。インターフェイスをインスタンス化することはできません。そのインターフェイスを実装するクラスのみです。

インターフェイスは動作を指定し、その動作はさまざまなタイプによってさまざまな方法で実装できます。そのように考えると、インターフェースをインスタンス化することは意味がありません。

1
Aaron

HashMapのkeySet()メソッドは必要なセットを既に作成しているので、単純に:

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

これは 見る デフォルトのキーのように、その内容は、基になる(defaults)マップに変更が加えられると変更されます。 keysに加えられた変更もマップに反映されますが、削除できるのは...マップからキーを追加するだけです。

元のマップと相互作用しないキーのコピーが必要な場合は、次のように提案されたタイプのいずれかを使用してください。

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