过去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[]
我的任务有什么问题?
答案 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 = ......