2011-03-26 77 views
7

如何在java中创建通用项的多维数组?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

什么是修复?

(我预计人们推荐使用列表请解释如何实现这一目标使用数组。)

+2

你可能想看看http://stackoverflow.com/questions/529085/java-how-to-generic-array-creation和http://stackoverflow.com/questions/3865946/error-generic-数组创建。 – 2011-03-26 21:37:35

+2

坚持数组而不是其他集合类型的原因是什么? – 2011-03-26 21:38:11

+0

您正在将对象[] []投射到A [] [],2不兼容。 – katsharp 2011-03-26 21:43:22

回答

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]; 
+0

不错!比我的更清洁。 – dsg 2011-03-26 22:02:38

+0

我相信以下内容也有效:'@SuppressWarnings(“unchecked”) A [] [] array =(A [] [])java.lang.reflect.Array.newInstance(A.class,2,3 );' – dsg 2011-03-26 22:15:21

+0

@dsg谢谢。我已经添加到我的编辑。 – 2011-03-26 22:18:13

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); 
+0

有没有办法获得基本对象的类而不实例化它? – dsg 2011-03-26 21:59:20

+0

虽然我很高兴你明白了这一点,但问题仍然是为什么要使用'ArrayList >>'来解决所有这些问题? – 2011-03-26 22:05:35

+0

不,这就是问题所在。在实例化之前,没有办法确定它的类型。看到我的回答,你可以使用'A [] []'来为你的阵列。 – 2011-03-26 22:24:39

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

+0

这很酷!我想你可以做'A [] [] array =(A [] [])new A [2] [3];' – dsg 2011-03-26 22:42:31

+0

是的,但是这样你就会有未经检查的警告,它添加@SuppressWarnings(“未选中”) – smas 2011-03-26 22:47:44

+0

您提供的链接已经死了...... – Alerty 2011-10-28 02:08:27

0

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

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 
    } 

} 
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

hi