2011-03-26 85 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