1

我正在使用这个:

List<String> row = new ArrayList<String>();
row.add("value 1");
row.add("value 2");
writer.writeRow(row);

它输出本质上是一个 ArrayList toString() 值:

"[value1, value2]"

如何获得以下内容?

"value1, value2"
4

2 回答 2

1

图书馆的作者在这里。我刚刚对其进行了更新以解决这个烦恼 - 这本质上是泛型的新手错误。

正如您在此提交中看到的,方法签名是:

public final void writeRow(Collection<Object> row)

当您传递 aList<String>时,它与正确的方法签名不匹配,并且将转到另一个接受 Object varargs 的方法签名。

我已经更新了代码以具有此签名,因为集合类型根本无关紧要:

public final void writeRow(Collection<?> row)

如果您更新到版本 2.6.0,您最初发布的代码将产生正确的结果,无需转换任何内容。

抱歉,添麻烦了。

于 2018-02-27T13:20:21.717 回答
1

更糟糕的是,标题是从列表中正确写入的:

List<String> headers = new ArrayList<String>();
headers.add("date");
writer.writeHeaders(headers);

我查看了他们的一些示例(特别是 com.univocity.parsers.examples.CsvWriterExamples)并看到输出是正确的。

所以我得到了这个:

String[] rowData = new String[2];
rowData[0] = "value 1";
rowData[1] = "value 2";
mWriter.writeRow(rowData);

这也产生了正确的输出。

由于还有一个带有 (Object... object) 参数的重载方法,我猜 Java 会使用那个方法。

我的问题可以通过将列表转换为集合来解决。

mWriter.writeRow((Collection)row);

我知道这几乎就是 Java 的工作原理,但我认为如果不需要极端性能,大多数人宁愿避免使用原语,所以这应该是开箱即用的——可能使用不同的签名方法。

于 2017-12-18T11:37:21.180 回答