如何在Java中创建一个通用数组?

1234
由于Java泛型的实现,您无法编写以下代码:
public class GenSet<E> {
    private E a[];

    public GenSet() {
        a = new E[INITIAL_ARRAY_LENGTH]; // error: generic array creation
    }
}

如何在保持类型安全的情况下实现这个?

我在Java论坛上看到了一个解决方案,如下所示:

import java.lang.reflect.Array;

class Stack<T> {
    public Stack(Class<T> clazz, int capacity) {
        array = (T[])Array.newInstance(clazz, capacity);
    }

    private final T[] array;
}

但是我真的不明白正在发生什么。

21
这里真的需要使用数组吗?使用集合类(Collection)如何? - matt b
16
我也认为使用集合更优雅解决这个问题。但由于这是一项课程作业,必须使用它们。 - tatsuhirosatou
5
我不明白为什么这里需要一个反射。Java语法很奇怪:例如new java.util.HashMap<String,String>[10]是无效的,new java.util.HashMap<long,long>(10)也是无效的,new long[][10]是无效的,但是new long[10][]是有效的。这些内容使编写一个能够编写Java程序的程序比看起来更加困难。 - bronze man
非常令人惊讶的是,一个如此重要的功能(Java 20)竟然还没有一个优雅的解决方案。 - undefined
32个回答

-1

试一下这个。

private int m = 0;
private int n = 0;
private Element<T>[][] elements = null;

public MatrixData(int m, int n)
{
    this.m = m;
    this.n = n;

    this.elements = new Element[m][n];
    for (int i = 0; i < m; i++)
    {
        for (int j = 0; j < n; j++)
        {
            this.elements[i][j] = new Element<T>();
        }
    }
}

1
我无法运行你的代码,你的Element类从哪里来? - user8389458

-1
private E a[];
private int size;

public GenSet(int elem)
{
    size = elem;
    a = (E[]) new E[size];
}

你应该总是为你的代码添加解释,并解释它为什么能够解决原始发布的问题。 - mjuarez

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接