无法实例化类型Set

我正在尝试创建一个字符串集,其中填充了来自Hashtable的键,因此for-each循环可以遍历Set并将默认值放在Hashtable中。 我还在学习Java,但我尝试这样做的方式并不是有效的语法。 有人可以certificate这样做的正确方法,并解释为什么我的方式不起作用,他们的方式。

private Hashtable defaultConfig() { Hashtable tbl = new Hashtable(); 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 tbl) { Hashtable defaults = new Hashtable(defaultConfig()); //The part in error is below... Set keys = new Set(defaults.keySet()); for (String k : keys) { if (!tbl.containsKey(k)) { tbl.put(k, defaults.get(k)); } } } 

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

所以基本上你只能实例化实现Set类( HashSetLinkedHashSetTreeSet

例如 :

 Set mySet = new HashSet(); 

Set是一个界面。 您无法实例化接口,只能实现该接口的类。

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

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

 Set keys = defaults.keySet(); 

这是默认值中的键的视图 ,因此当对基础( defaults )映射进行更改时,其内容将更改。 对keys更改也会反映在地图中,但您只能从地图中删除…不添加…键。

如果您需要不与原始地图交互的密钥副本,请使用建议的其中一种类型,如:

 Set keys = new HashSet( defaults.keySet() );