36

我正在尝试创建一组字符串,其中填充了来自 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));
        }
    }
}
4

3 回答 3

76

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

所以基本上你只能实例化实现Set( HashSet,LinkedHashSetTreeSet)的类

例如 :

Set<String> mySet = new HashSet<String>();
于 2013-09-22T17:26:11.637 回答
2

Set是一个接口。您不能实例化接口,只能实例化实现该接口的类。

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

于 2013-09-22T17:26:29.223 回答
0

HashMap 的keySet()方法已经创建了你需要的集合,所以很简单:

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

这是默认键的视图defaults,因此当对底层 ( ) 映射进行更改时,其内容将发生变化。所做的更改keys也将反映在地图中,但您只能从地图中删除...而不是添加...键。

如果您需要不与原始地图交互的键的副本,请使用建议的类型之一,如下所示:

Set<String> keys = new HashSet( defaults.keySet() );
于 2013-09-22T18:02:04.323 回答