我正在尝试使用以下构造函数创建一个对象
public PageBreak(String sheetName, ArrayList<Integer> rowPageBreaks, ArrayList<Integer> columnPageBreaks)
{
this.sheetName = sheetName;
this.rowPageBreaks = rowPageBreaks;
this.columnPageBreaks = columnPageBreaks;
}
在另一种方法中,我进行以下调用:
pageBreaks.add(new PageBreak(teamResultSheet.getName(),
new ArrayList<Integer>().add(teamResultSheet.getRowPageBreak()), null));
i然后收到以下错误消息:constructor pagebreak(字符串,布尔,null)未定义。
如何在现场创建ArrayList<Integer>
?
您将要在尝试使用它之前填充列表。这是发生的事情:
- 您实例化了新的
ArrayList<Integer>
。 - 您立即在该列表上调用
add
。 -
add
的结果是boolean
(因此始终返回true)。 -
boolean
结果是解释的,不是
虽然Makoto的答案是正确的,并解释了您为什么会遇到此错误,并在使用它之前为您提供明智的建议来创建阵列列表,但您可能想知道是否有其他方法您可以使代码更简洁。
与最近的语言(例如Groovy或Kotlin)不同,Java不幸的是,Java没有列表文字作为语言语法。已经有一些尝试围绕这一限制的尝试。您可能正在尝试使用代码的是双支架初始化成语:
pageBreaks.add(new PageBreak(teamResultSheet.getName(),
new ArrayList<Integer>() {{add(teamResultSheet.getRowPageBreak());}},
null);
尽管这看起来可能很可爱,但确实具有其缺点,如上面的链接中所述。
您真的需要将实际的ArrayList
S传递给构造函数吗?为什么不这样做List
s,这会使它更加灵活:
public PageBreak(String sheetName, List<Integer> rowPageBreaks, List<Integer> columnPageBreaks)
{
...
}
然后,您可以自由地将其传递ArrayList
S,例如以前或任何其他类型的List
:
pageBreaks.add(new PageBreak(teamResultSheet.getName(),
Arrays.asList(teamResultSheet.getRowPageBreak()),
null);
这看起来更简洁,没有前者的缺点。但是,该列表是固定尺寸和不变的。
如果您只想要单元素列表,则使用以下内容更有效:
pageBreaks.add(new PageBreak(teamResultSheet.getName(),
Collections.singletonList(teamResultSheet.getRowPageBreak()),
null);