Java 无法实例化类型集

Java 无法实例化类型集,java,set,hashtable,Java,Set,Hashtable,我正在尝试创建一组字符串,这些字符串由哈希表中的键填充,这样for-each循环就可以遍历该字符串集,并将默认值放入哈希表中。我仍在学习Java,但我尝试的方法不是有效的语法。请有人演示一下正确的方法,并解释为什么我的方法不起作用,而他们的方法起作用 private Hashtable<String, String> defaultConfig() { Hashtable<String, String> tbl = new Hashtable<String,

我正在尝试创建一组字符串,这些字符串由哈希表中的键填充,这样for-each循环就可以遍历该字符串集,并将默认值放入哈希表中。我仍在学习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));
        }
    }
}
private哈希表defaultConfig(){
Hashtable tbl=新的Hashtable();
tbl.put(“nginx服务器”,“etc/nginx/servers”);
tbl.put(“fpm服务器”,“etc/fpm/”);
tbl.put(“fpm门户”,“9001”);
tbl.put(“webalizer脚本”,“/usr/local/bin/webalizer.sh”);
tbl.put(“sys useradd”,“/sbin/useradd”);
tbl.put(“系统nginx”,“/usr/sbin/nginx”);
tbl.put(“sys fpmrc”,“etc/rc.d/php_fpm”);
tbl.put(“www-sites”,即“/var/www/sites/”);
tbl.put(“www集团”、“www”);
返回tbl;
}
//这会将缺少的配置选项设置为其默认值。
缺少私有void fixMissing(哈希表tbl){
Hashtable defaults=新的Hashtable(defaultConfig());
//下面是错误的部分。。。
Set keys=新的集合(defaults.keySet());
用于(字符串k:键){
如果(!tbl.containsKey(k)){
tbl.put(k,defaults.get(k));
}
}
}

Set
不是一个类,而是一个接口

因此,基本上您只能实例化实现
Set
HashSet
LinkedHashSet
TreeSet
)的类

例如:

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

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

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

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

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

应该是
newhashset()哈希表大部分是过时的-您通常应该使用HashMap。可能重复@JonSkeet“除非您实际上不想使用原始类型…”为什么不?据我所知,
集合
非常适合1。防止重复条目2。检查集合中是否存在项,因为它是
contains()
方法,比
List
Map
方法简单/快速。这不是原始类型。我怀疑最初的答案是
Set mySet=newhashset()。这些是原始类型-没有泛型类型参数。我怀疑答案是在5分钟内编辑的,这意味着没有原始类型的原始版本记录。一个
接口定义了这个对象中应该包含的内容。
HashSet
Set
接口的实现,因此它包含Set接口定义的方法和属性。
Set<String> keys = new HashSet( defaults.keySet() );