使用 Class 对象创建通用二维数组

Posted

技术标签:

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

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

【问题讨论】:

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

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

【讨论】:

以上是关于使用 Class 对象创建通用二维数组的主要内容,如果未能解决你的问题,请参考以下文章

通过解析 JSON-SwiftyJSON 创建一个 Class 对象数组

java如何判断两个二维对象数组相等,让后打印一句话。

如何使用二维np数组作为输入来创建networkx图

C++之申请释放内存(对象数组和99乘法表)

Java怎样用数组创建对象,并对对象里的属性排序?

我在创建一个Class Album后声明了一个对象数组。最后一个对象的变量会覆盖其他对象