Java 通用多维数组转换函数

Java 通用多维数组转换函数,java,arrays,generics,multidimensional-array,Java,Arrays,Generics,Multidimensional Array,此函数用于将字符串的二维集合转换为字符串的二维数组: public static String[][] toArray( Collection<? extends Collection<String>> values){ String[][] result = new String[ values.size() ][]; int i=0; for( Collection<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;
}
公共静态字符串[][]到阵列(

集合泛型和数组不会混合。一种替代方法是传递表示
X
Class
实例,并使用该实例创建返回数组(请参阅)。我认为更好的方法是将
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;
}

public static X[][]toArray(集合泛型和数组不会混合使用。一种替代方法是传递一个表示
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;
}
publicstaticx[]toArray(Collection恐怕您不能

这是因为Java的数组(与泛型不同)在运行时包含有关其组件类型的信息。因此,在创建数组时必须知道组件类型。因为在运行时不知道t是什么,所以无法创建数组

资料来源:,恐怕你不能

这是因为Java的数组(与泛型不同)在运行时包含有关其组件类型的信息。因此,在创建数组时必须知道组件类型。因为在运行时不知道t是什么,所以无法创建数组


来源:,由

提供,因此由于类型擦除,这是不可能的。但至少有一种解决方案:

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;
}
publicstaticx[]toArray(类xClass,

集合因此,由于类型擦除,这是不可能的。但至少有一个解决方案:

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;
}
publicstaticx[]toArray(类xClass,

CollectionHi,谢谢。您的代码中缺少“result[i]=”。在本例中,您不需要指定第二个维度:“new Integer[2][]”很好。但此解决方案没有(至少我没有)使用此函数。我不想提前创建数组。@Scheintod您需要第二个维度,并且不需要
result[i] =
如果数组大小合适。如果你不想创建数组,你可以1)返回一个
对象[]
或2)使用我描述的
类方法。啊。对不起。错过了(result[i++])部分,因为我没有这样使用它。在我看来,这叫“难以发现错误”。因为如果将其指定为“小”,则不会得到任何警告,但不会得到任何结果。@Scheintod您可以轻松地添加一个检查,
result.length==values.size()
。想法保持不变。啊。很难遵循编辑:)谢谢。我会将此标记为正确。对我来说,主要是因为引用了Arrays.newInstance,我可以用它自己来计算。但作为参考,这将是更“有趣”的解决方案(提示;)。您好,谢谢。您的代码中缺少了“result[I]=”。在示例中,您不需要指定第二个维度:“新整数[2][]”很好。但是这个解决方案没有(至少是我的)使用这个函数的意义。我不想提前创建数组。@Scheintod如果数组大小合适,您确实需要第二个维度,并且不需要
result[I]=
。如果不想创建数组,您可以1)返回
对象[]
或2)使用我描述的
方法。啊。抱歉。错过了(结果[I++])部分,因为我没有这样使用它。在我看来,这叫“难以发现错误”“。因为如果将其指定为“小”,则不会得到任何警告,但不会得到任何结果。@Scheintod您可以轻松地为其添加检查,
result.length==values.size()
。想法保持不变。啊。很难遵循编辑:)谢谢。我会将此标记为正确。对我来说,主要是因为我引用了Arrays.newInstance,我可以用它自己找出答案。但作为参考,这将是更“有趣”的解决方案(提示;)).从技术上来说,这是对我的问题最正确的回答。但它是最没有帮助的。(:是的……但你不能尊重你提出的界面并解决你的问题。我认为你需要尊重它,这就是为什么我没有发布任何替代方案。从技术上来说,这是对我的问题最正确的回答。但它是最没有帮助的。(:是的……但是你不能尊重你提出的界面并解决你的问题。我认为你需要尊重它,这就是为什么我没有发布任何替代方案。
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;
}