【问题标题】:Is it possible to create a 2D jagged array of a generic type in Java?是否可以在 Java 中创建一个泛型类型的二维锯齿状数组?
【发布时间】:2014-09-29 08:07:18
【问题描述】:

是否可以创建一个只有 Java 中指定大小的泛型类型参数的二维数组?

为了说明,我们可以这样创建一个数组吗:

T[][] array = new T[x][];

【问题讨论】:

  • 你试过了吗?有用。编译器是你的朋友。
  • @gexicide 我确实试过了,但它甚至对T[] arr = new T[x]; 也不起作用。它给了error: generic array creation
  • 问题不在于二维锯齿状数组。问题是T 类型,它似乎是一个泛型类型参数。无法创建泛型类型参数数组。
  • 对,我正在尝试创建一个泛型类型参数的数组。我会编辑这个问题,因为它是模棱两可的。

标签: java generics multidimensional-array jagged-arrays


【解决方案1】:

您在问题中提到“泛型”并使用标识符 T 作为您的类型,所以我假设您正在谈论创建泛型类型参数的数组。

你不能在 Java 中做到这一点。数组和泛型不能很好地混合。您可以使用反射 (see this question) 来实现,但使用集合类可能会更轻松。这将是一个列表列表,以获得一个 2D 衣衫褴褛的容器。

【讨论】:

    【解决方案2】:

    不是使用泛型,而是使用已知的类是可能的。对于泛型,我建议使用 ArrayList 或类似的。

     String[][] array = new String[2][];
    

    可以这样使用:

    array[0] = new String[1];
    array[1] = new String[4];
    array[0][0] = "Hello 0,0";
    array[1][1] = "Hello 1,1 ";
    
    System.out.println(array[0][0]);
    System.out.println(array[1][1]);
    

    【讨论】:

      【解决方案3】:

      您需要一个通用的多维数组。你不能创建一个。但是,您可以创建一个 Object 数组,然后对其进行转换。这是创建泛型数组的“通常”方式:

      @SuppressWarnings("unchecked")
      T[][] array = (T[][])new Object[x][];
      

      您需要@SuppressWarnings("unchecked"),因为演员表不安全且经过检查。从类型论的角度来看,它甚至是“错误的”(Object 类型的数组不是T 的数组),但是 Java 的类型系统有这种不一致,这是处理它的方法。

      【讨论】:

      • 谢谢,但我试过没有成功。当我在方法中使用强制转换创建并返回相同的数组,并尝试在调用该方法时存储此结果时,我收到一个错误,即我无法将 Object[][] 存储在(比方说)整数中[][]。
      • @EmrehanTuzun:你解释的行为听起来很奇怪。请发布您失败的确切代码。 (调用它的方法和代码)
      • 这里是失败的代码:pastebin.com/y9TLjJMx。我试图概括这个要点:gist.github.com/emrehan/bc24dea0878dcfe5cdcb
      猜你喜欢
      • 2012-05-03
      • 1970-01-01
      • 1970-01-01
      • 2011-02-04
      • 2014-05-16
      • 1970-01-01
      • 2015-10-18
      • 2012-06-04
      • 1970-01-01
      相关资源
      最近更新 更多