2013-09-22 20 views
18

ハッシュテーブルのキーで満たされた文字列のセットを作成しようとしています。for-eachループはSetを繰り返し処理し、デフォルトをハッシュテーブルに入れます。私はまだ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)); 
     } 
    } 
} 
+0

は '新しいHashSetの()でなければなりません;' –

+0

あなたは元のマップと相互作用しないキーのコピーが必要な場合は、そのタイプのいずれかを使用するには、のように、提案しましたハッシュテーブルはほとんど廃止されています。代わりにハッシュマップを使うべきです。 – assylias

+0

[List List ]をインスタンス化できません。(http://stackoverflow.com/questions/7960149/cannot-instantiate-the-type-listproduct) – Raedwald

答えて

40

Setはクラスではなく、インターフェイスです。

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

あなたは実際に生のタイプを使用したくないでしょう... –

+1

ああ、私はルーキーミス私が作った。 –

1

セットインタフェースです:

だから、基本的には、例えばSetHashSetLinkedHashSetまたはTreeSet

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

インターフェイスは動作を指定し、その動作はさまざまな種類によってさまざまな方法で実装できます。そのようなことを考えると、インターフェースをインスタンス化するのは意味がありません。なぜなら、どのようなことが必要かを指定しているのではなく、どのように行うのかということです。

0

のHashMapのkeySet()方法はまだ単に、あなたが必要なセットを作成します。その内容は、基礎となるに変更が行われたときに変更されますので、これは、デフォルトのキーのビューある

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

defaults )地図。 keysに加えられた変更もマップに反映されますが、マップからは追加しない...キーのみを削除できます。

Set<String> keys = new HashSet(defaults.keySet()); 
関連する問題