【问题标题】:Creating generic two-dimensional array using Class object使用 Class 对象创建通用二维数组
【发布时间】:2022-01-17 05:28:53
【问题描述】:

我有泛型类型,构造函数中提供了Class<T> 对象。我想在这个构造函数中创建二维数组T[][],这可能吗?

【问题讨论】:

  • 不在 Java 中,仅在具有运行时泛型的语言中,如 C#。考虑擦除。
  • 请发布您正在考虑使用的构造函数的特定签名。这可能是可能的,但不清楚你在问什么。
  • 是的,您可以使用 Array.newInstance()。见stackoverflow.com/questions/529085/…。我会标记为重复,但我没有标记,有人可以解决这个问题吗?
  • @JasonC 这并不完全是重复的,因为这是在询问二维数组,而您链接的问题似乎没有谈论创建多维实例,这可能会导致有人认为它仅适用于一维,因此需要比实际更复杂的过程。
  • 它作为副本被关闭,尽管我现在不同意上面@JAB的cmets。之前在此处发布的其他一些答案(现已删除)表明缺乏对链接问题中描述的 1D 案例可以扩展到 2D 的理解 - 正是上述 JAB 的情况。我试图在我的回答中证明这一点。我实际上觉得应该重新打开这个问题,并将另一个问题标记为 this 的重复问题,因为这是一个更普遍的情况。

标签: java arrays class generics


【解决方案1】:

How to create a generic array in Java? 相同,但扩展到二维:

import java.lang.reflect.Array;

public class Example <T> {

    private final Class<? extends T> cls;

    public Example (Class<? extends T> cls) {
        this.cls = cls;
    }

    public void arrayExample () {
        // a [10][20] array
        @SuppressWarnings("unchecked")
        T[][] array = (T[][])Array.newInstance(cls, 10, 20);
        System.out.println(array.length + " " + array[0].length + " " + array.getClass());
    }

    public static final void main (String[] args) {
        new Example<Integer>(Integer.class).arrayExample();
    }

}

阅读上面JAB的评论后注意:要扩展到更多维度,只需将[]和维度参数添加到newInstance()(cls是一个类,d1到d5是整数):

T[] array = (T[])Array.newInstance(cls, d1);
T[][] array = (T[][])Array.newInstance(cls, d1, d2);
T[][][] array = (T[][][])Array.newInstance(cls, d1, d2, d3);
T[][][][] array = (T[][][][])Array.newInstance(cls, d1, d2, d3, d4);
T[][][][][] array = (T[][][][][])Array.newInstance(cls, d1, d2, d3, d4, d5);

详情请见Array.newInstance()

【讨论】:

  • 我注意到 OP 编辑​​了问题并添加了“在这个构造函数中”。与上面相同的方法(例如,将代码从 arrayExample() 移动到构造函数中)。
  • 谢谢,我不知道(我以为我检查了文档)我可以使用带有更多参数的 newInstance - 我的错,我可以检查一下。
  • 投到T[][](或其他)是不安全的。 cls 可能是原始类型。
  • @newacct +1 但我没票了。您必须执行new Example&lt;Integer&gt;(int.class) 之类的操作才能达到这一点,这可能很奇怪,但是是的,您是对的。有机会我会更新的。
  • @JasonC:好吧,你可以只返回Object 而不是特定类型的数组。或者至少,多维数组的最后一级必须替换为Object。 (所以,二维数组可以安全地用Object[]表示;一维数组只能用Object表示。)
【解决方案2】:

你必须使用反射,但这是可能的:http://docs.oracle.com/javase/7/docs/api/java/lang/reflect/Array.html#newInstance%28java.lang.Class,%20int...%29

使用指定的组件类型和尺寸创建一个新数组。

【讨论】:

    猜你喜欢
    • 2021-06-16
    • 2020-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-17
    • 2019-06-14
    相关资源
    最近更新 更多