如何在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
有什么问题?
(我预计人们会建议使用列表。请解释如何使用数组实现此目的。)
答案 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
喜