java:多维通用数组创建

时间:2011-03-26 21:32:34

标签: java arrays generics multidimensional-array

如何在java中创建通用项的多维数组?

考虑课程:

class A<T>
  {
    T t;
    public A(T t) { this.t = t; }
  }

当我尝试创建一个多维数组时:

A<String>[][] array = new A<String>[2][3];

我收到以下错误:

generic array creation
A<String>[][] array = new A<String>[2][3];
                      ^

我尝试了以下内容:

A<String>[][] array = (A<String>[][]) (new Object[2]3]);

但这只是抛出:java.lang.ClassCastException

有什么问题?

(我预计人们会建议使用列表。请解释如何使用数组实现此目的。)

7 个答案:

答案 0 :(得分:4)

我能够做这样的事情

    @SuppressWarnings("unchecked") 
    A<String>[][] array = (A<String>[][]) Array.newInstance(new A<String>("dummy").getClass(), 2, 3);

修改

来自@ dsg的建议,下面将跳过临时对象的创建。

    @SuppressWarnings("unchecked") 
    A<String>[][] array = (A<String>[][]) Array.newInstance(A.class, 2, 3);

或(来自@ irreputable的建议)

 @SuppressWarnings("unchecked")
 A<String>[][] array = new A[2][3];

答案 1 :(得分:2)

您无法以简单的方式创建特定于类型的泛型数组。

List<String>[] list = new List<String>[2]; //Illegal
List<?> aa[] = new List<?>[2]; // OK
...
A<?>[][] array = new A<?>[2][3]; // OK
A[0][0] = new A<String>(...);

这是一篇关于Java 1.5泛型的有趣文章,“Java theory and practice: Generics gotchas

答案 2 :(得分:1)

感谢评论,我能够拼凑出一个解决方案。

正如我们所见,A<String>[][] array = new A<String>[2][3];不起作用。

这里是如何构建一个2x3 A<String>个对象的数组:

// get the class of the basic object
Class c = new A<String>("t").getClass();

// get the class of the inner array
A<String>[] a0 = (A<String>[]) java.lang.reflect.Array.newInstance(c, 0);

// construct the outer array
A<String>[][] array = (A<String>[][]) java.lang.reflect.Array.newInstance(a0.getClass(), 2); 

// fill it with instances of the inner array
for (int i = 0; i < 2; ++ i)
{   
  array[i] = (A<String>[]) java.lang.reflect.Array.newInstance(c, 3); 
}

更清洁的版本(谢谢,@ Balla R):

@SuppressWarnings("unchecked")
A<String>[][] array = (A<String>[][]) java.lang.reflect.Array.newInstance(A.class,2,3);

答案 3 :(得分:1)

你为什么不这样做:(非通用的)

String[][] non_generic_array = new String[][];

并创建一个实用程序类来实现您在A<T>中所做的功能(正如我想的那样)。例如:

当你在A

中有这个时
public class A<T>
{
    T obj;
    public A(T obj) { this.obj = obj; }

    public void someFunction() { ... }
}

您可以创建实用程序类:

public class AUtils
{

    public static <T> void someFunction(T obj)
    {
        // Here your code, applied to obj
    }

}

答案 4 :(得分:1)

new A[][]并将其投放到A<String>[][]

答案 5 :(得分:0)

嗯,我认为Java Arrays(从Java 6开始)不支持泛型。当我开始使用java中的泛型编程时,我最大的“wtf”之一。

答案 6 :(得分:0)

class A<T> 
{
    T s;

    public A(T t)
    {
        s = t;
    }

    public String getType()
    {
        return s.getClass().toString();
    }

    public T getThing()
    {
        return s;
    }
}

public static void main(String[] args) 
{
    A<?>[][] a = new A<?>[2][3];
    a[0][1] = new A<String>("hi");

    System.out.println(a[0][1].getType());
    System.out.println(a[0][1].getThing());

    A<String> b = (A<String>) a[0][1];
}

输出:

  

class java.lang.String