数组列表初始化显示为布尔值

时间:2016-11-24 19:32:00

标签: java

我正在尝试使用以下构造函数

创建一个对象
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));

然后我收到以下错误消息:构造函数PageBreak(String,boolean,null)未定义。

如何在现场制作ArrayList<Integer>

2 个答案:

答案 0 :(得分:3)

您希望在尝试使用之前填充列表。这是正在发生的事情:

  • 您实例化一个新的ArrayList<Integer>
  • 立即在该列表中呼叫add
  • add的结果为boolean(因此always returns true)。
  • boolean结果是解释的内容,列表。

答案 1 :(得分:1)

虽然Makoto的答案是正确的,并解释了为什么你会收到这个错误,并在你使用之前给出合理的建议来创建你的ArrayList,你可能想知道是否还有其他方法可以使你的代码更简洁。

与更新的语言(例如Groovy或Kotlin)不同,Java遗憾的是没有List文字作为语言语法。已经有一些尝试来解决这个限制;您尝试使用代码的是double brace initialization idiom

pageBreaks.add(new PageBreak(teamResultSheet.getName(),
               new ArrayList<Integer>() {{add(teamResultSheet.getRowPageBreak());}},
               null);

虽然这可能看起来很可爱,但它确实有其缺点,如上面的链接所述。

你真的需要将实际的ArrayList传递给你的构造函数吗?为什么不让它List,这会使它更灵活:

public PageBreak(String sheetName, List<Integer> rowPageBreaks, List<Integer> columnPageBreaks)
{
    ...
}

然后你可以像以前那样自由地传递它ArrayList,或任何其他类型的List

pageBreaks.add(new PageBreak(teamResultSheet.getName(),
               Arrays.asList(teamResultSheet.getRowPageBreak()),
               null);

这看起来更简洁,并没有以前的缺点;但是,列表是固定大小和不可变的。

如果您只想要单个元素列表,那么使用以下内容会更有效:

pageBreaks.add(new PageBreak(teamResultSheet.getName(),
               Collections.singletonList(teamResultSheet.getRowPageBreak()),
               null);