此函数将Collection
的{{1}}转换为String
的二维数组:
String
如何编写此函数以便一般性地执行此操作:
public static String[][] toArray(
Collection<? extends Collection<String>> values){
String[][] result = new String[ values.size() ][];
int i=0;
for( Collection<String> row : values ){
result[i] = row.toArray( new String[ row.size() ] );
i++;
}
return result;
}
答案 0 :(得分:2)
泛型和数组不混合。一种替代方法是传递表示Class
的{{1}}实例,并使用它来创建返回数组(请参阅Array.newInstance()
)。我认为更好的方法是将X
作为另一个参数传递,填充并返回:
X[][]
例如:
public static <X> X[][] toArray(Collection<? extends Collection<X>> values,
X[][] result) {
int i = 0;
for (Collection<X> row : values)
result[i] = row.toArray(result[i++]);
return result;
}
[[1, 2, 3], [4, 5], [6]]
答案 1 :(得分:2)
我担心你不能。
这是因为Java的数组(与泛型不同)在运行时包含有关其组件类型的信息。因此,在创建阵列时必须知道组件类型。由于您不知道T在运行时是什么,因此无法创建数组
答案 2 :(得分:0)
因为类型擦除所以不可能。但至少有一个解决方案:
public static <X> X[][] toArray( Class<X> xClass,
Collection<? extends Collection<X>> values ){
@SuppressWarnings( "unchecked" )
X[][] result = (X[][])Array.newInstance( xClass , values.size(), 0 );
int i=0;
for( Collection<X> row : values ){
@SuppressWarnings( "unchecked" )
X[] rowAsArray = (X[])Array.newInstance( xClass, row.size() );
result[i] = row.toArray( rowAsArray );
i++;
}
return result;
}
(感谢您指点我Array.newInstance
)