阵列列表初始化显示为布尔值



我正在尝试使用以下构造函数创建一个对象

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);

最新更新