无法从String数组创建Set

时间:2014-12-19 20:42:21

标签: java

过去5分钟我一直盯着屏幕,似乎无法弄清楚我做错了什么:

class Example {

    private final Set<String> values;

    public Example(String... values) {
        values = new HashSet<String>(Arrays.asList(values));
    }
}

我很惊讶为什么无法将String[]转换为List<String>来初始化HashSet<String>

我收到了构建错误:

incompatible types: java.util.HashSet<java.lang.String> cannot be converted to java.lang.String[]

我的任务有什么问题?

4 个答案:

答案 0 :(得分:9)

您错过了实际访问私有字段的资格。目前,您正在尝试重新分配传递给构造函数的参数。相反,您应该使用以下代码:

public Example(String... values) {
     this.values = new HashSet<String>(Arrays.asList(values));
}

使用&#34; Diamond Operator&#34;可以进一步缩短这一点,这是自Java 7以来可用的:

public Example(String... values) {
     this.values = new HashSet<>(Arrays.asList(values));
}

答案 1 :(得分:3)

这就是你如何做到的

 if(values != null)
      this.values = new HashSet<>(Arrays.asList(values));
 else
      this.values = Collections.emptySet();

在赋值之前添加if(values!= null)检查。无论何时使用var args,你都会公开一个允许你的客户创建一个没有任何参数的有效Example对象的契约。如果你想避免这种情况发生然后直接使用String []值并在其为null时抛出异常

答案 2 :(得分:3)

其他答案已经解决了原因,但简单地重命名参数以避免阴影会不会更好?

答案 3 :(得分:0)

在构造函数中使用this.values代替value,因为构造函数的参数是字符串数组,并且您正在尝试将List转换为数组。

this.values = ......