我正在尝试创建一个字符串集,其中填充了来自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 :(得分:52)
Set
不是一个类,它是一个接口。
所以基本上你只能实例化实现Set
(HashSet
,LinkedHashSet
或TreeSet
)的类
例如:
Set<String> mySet = new HashSet<String>();
答案 1 :(得分:1)
Set是一个界面。您无法实例化接口,只能实现该接口的类。
接口指定行为,并且可以通过不同类型以不同方式实现该行为。如果您这样想,那么实例化一个接口是没有意义的,因为它指定了一个必须做的事情,而不是它是如何做的。
答案 2 :(得分:0)
HashMap的keySet()
方法已经创建了您需要的集合,所以简单地说:
Set<String> keys = defaults.keySet();
这是默认情况下键的视图,因此当对基础(defaults
)地图进行更改时,其内容将会更改。对keys
所做的更改也会反映在地图中,但您只能从地图中删除...而不是添加...键。
如果您需要不与原始地图互动的密钥副本,请使用建议的其中一种类型,如:
Set<String> keys = new HashSet( defaults.keySet() );