2013-09-22 223 views
18

我想创建一个字符串集合,其中填充了来自Hashtable的键,因此for-each循环可以迭代Set并将默认值放入Hashtable中。我仍然在学习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

散列表大多已经过时 - 你应该一般使用HashMap来代替。 – assylias

+0

可能的重复[无法实例化类型列表](http://stackoverflow.com/questions/7960149/cannot-instantiate-the-type-listproduct) – Raedwald

回答

40

Set不是一个类,它是一个接口。

因此,基本上可以仅实例实施SetHashSetLinkedHashSetTreeSet

例如类:

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

除了你实际上并不想使用原始类型...... –

+1

啊,我做了一个新人的错误。 –

1

设置是一个接口。你不能实例化一个接口,只能实现那个接口的类。

该接口指定行为,并且该行为可以按不同类型以不同方式实现。如果你这样想,那么实例化一个接口是没有意义的,因为它指定了什么是必须做的,而不是它是如何做的。

0

的HashMap的keySet()方法已经创建你所需要的设定,所以干脆:

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

这是一个视图中默认的按键,所以更改时其内容将变为底层(defaults )地图。对keys所做的更改也会反映在地图中,但您只能从地图中删除...不添加...键。

如果你需要的是不与原始地图交互的密钥的副本,然后使用类型中的一个建议,如:

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