我想要创建构造函数,它将获取一个或多个整数并将其作为ImmutableList保存到字段中。根据Bloch的第42项中“使用varargs传递一个或多个论点的正确方法”,我创建了像smt一样的
class Foo{
private final ImmutableList<Integer> bar;
public Foo(Integer first, Integer... other) {
this.bar = ImmutableList.<Integer>builder()
.add(first)
.addAll(Arrays.asList(other))
.build();
}
}
为什么构建器不会自动获得通用?而且,因为它闻起来。我怎么能改写它?
UPD 解决了仿制药的问题。任何有关重构的建议都非常有用。
答案 0 :(得分:14)
因为在调用builder()
时没有表达式的左侧。编译器无法推断要添加的类型。 (它无法从后续方法调用中推断出来)
如果您将其更改为以下内容,则可以:
Builder<Integer> builder = ImmutableList.builder();
this.bar = builder.add(first).addAll(Arrays.asList(other)).build();
但是,您可以安全地保留当前代码 - 这很好。甚至比上面的例子更好(它更短)
关于重构 - 为什么不使用.add(first).add(other)
? add
方法有一个varargs版本。
答案 1 :(得分:8)
关于你的第二个问题(如何重构构造函数以使其更短/更易读),我会这样做:
class Foo{
private final ImmutableList<Integer> bar;
public Foo(Integer first, Integer... other) {
this.bar = ImmutableList.copyOf(Lists.asList(first, other));
}
}
根据他们的javadoc,两种Lists.asList方法的设计都考虑到了这一目标:
这在varargs方法时很有用 需要使用诸如(Foo firstFoo,Foo ... moreFoos),按顺序 避免过载模糊或 强制执行最小参数计数。
它比ImmutableList.Builder更高效,因为它避免了在Builder中创建/调整临时ArrayList的大小。