繁体   English   中英

java:多维通用数组创建

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM