使用 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<Integer>(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 对象创建通用二维数组的主要内容,如果未能解决你的问题,请参考以下文章