[英]java: multidimensional generic array creation
如何在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
有什么问题?
(我预计人们会建议使用列表。请解释如何使用数组实现此目的。)
我能够做这样的事情
@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];
您不能以简单的方式创建特定于类型的泛型数组。
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理论与实践:泛型陷阱 ”
感谢评论,我能够拼凑出一个解决方案。
如我们所见, A<String>[][] array = new A<String>[2][3];
不起作用。
这里是如何构造一个有效的A<String>
对象的2x3
数组:
// 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);
你为什么不这样做:(非泛型的)
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
}
}
new A[][]
并将其强制转换为A<String>[][]
嗯,我认为Java Arrays(从Java 6开始)不支持泛型。 当我开始使用java中的泛型编程时,我最大的“wtf”之一。
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
嗨
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.