无法实例化类型 Set

Posted

技术标签:

【中文标题】无法实例化类型 Set【英文标题】:Cannot instantiate the type Set 【发布时间】:2013-09-27 14:32:39 【问题描述】:

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

【问题讨论】:

应该是new HashSet&lt;String&gt;(); Hashtable 基本上已经过时了——你通常应该使用 HashMap 来代替。 Cannot instantiate the type List<Product>的可能重复 【参考方案1】:

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

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

例如:

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

【讨论】:

@JonSkeet “除非你真的不想使用原始类型......” 为什么不呢?据我了解,Set 非常适合 1. 防止重复条目 2. 检查集合中是否存在条目,因为它的 contains() 方法比 ListMap 更简单/更快。跨度> @AgiHammerthief:这不是原始类型。我怀疑原来的答案是Set mySet = new HashSet();。这些是原始类型 - 没有泛型类型参数。我怀疑答案是在 5 分钟内被编辑的,这意味着没有原始版本的原始类型记录。 一个interface 定义了这个对象里面应该有什么。 HashSetSet interface 的实现,因此它包含 Set 接口定义的方法和属性。【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

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

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

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

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

【讨论】:

以上是关于无法实例化类型 Set的主要内容,如果未能解决你的问题,请参考以下文章

C# 如何根据指定变量来实例化对象?

为啥我的通用服务出现“无法实例化实现类型”错误?

无法实例化类型 AppiumDriver

无法实例化包含用户定义类型的类

无法实例化类型集群,Mahout 中的 KMean 集群示例

为啥我在实例化接口时会出错?