问题
不能使用Collection#toArray()
并将结果强制转换为char[][]
的原因是:
返回的数组的runtime component type是Object
。
解决方案
Java 11之前的版本
您可以使用Collection#toArray(T[])
来指定数组的组件类型。
Collection<char[]> collection = ...;
char[][] array = collection.toArray(new char[0][]);
要了解为什么不需要指定第二维,请记住Java中的二维数组只是一维数组,其中每个元素都是一个数组。有关更多信息,请参见以下问答:
关于使用0
作为第一个维度,请注意,不需要使用0
;您可以使用所需的任何有效长度(例如collection.size()
)。但是,使用0
的原因是,至少在HotSpot 8上使用ArrayList
时,据说效率更高:
我不确定在其他版本,其他JVM实现或其他Collection
实现中它是否更有效。
Java 11 +
如果您使用的是Java 11+,则有一个替代解决方案:Collection#toArray(IntFunction)
。
Collection<char[]> collection = ...;
char[][] array = collection.toArray(char[][]::new);
作为lambda表达式,它看起来像:
Collection<char[] collection = ...;
char[][] array = collection.toArray(i -> new char[i][]);
手册副本
#toArray
的两种方法最终都类似于以下内容:
Collection<char[]> collection = ...;
char[][] array = new char[collection.size()][];
int index = 0;
for (char[] element : collection) {
array[index++] = element;
}
尽管您应该使用#toArray
方法之一,因为它允许Collection
实现使用其可以进行的任何优化。例如,ArrayList
类使用System#arraycopy
方法。
,
尝试一下:
const path = require('path');
// make sure sub-directory is created
let dirForFile = path.join(__dirname,someDir);
if (!fs.existsSync(dirForFile) {
fs.mkDirSync(dirForFile);
}
// append data to the file
let pathToFile = path.join(dirForFile,"filename.txt");
fs.appendFileSync(pathToFile,dataToWrite);
或使用for循环打印
List<char[]> list = List.of(new char[] { '1','2'
},new char[] { '3','4'
},new char[] { '6','7'
});
char[][] array = list.stream().toArray(char[][]::new);
System.out.println(Arrays.deepToString(array));
本文链接:https://www.f2er.com/3156243.html