0

我正在用 Java 实现这样的接口:

public interface Stack <E>{
    public int size();
    public boolean isEmpty();

实现它的类:

public class StackArray<E> implements Stack<E>{
    private Object list[];
    private int top=-1;
    public StackArray(int n){
        list=new Object[n];
    }

这很好用,所以当我调用它时,我这样做:

public static void main(String[] args) {
        // TODO code application logic here
        StackArray<Students> st=new StackArray<>(4);

所以我怎么能实现它,但是使用泛型,我试过这个:

public class StackArray<E> implements Stack<E>{
    private E st[];
    private int top=-1;
    public StackArray(int n){
        st=(E[]) Array.newInstance(null, n);
    }

但我得到了一个 nullPointerException,有没有办法超越这个?

4

2 回答 2

1

由于类型擦除getClass(),在创建对象数组时,您有时需要传递实际的类(或可以从中获取该类的实际对象)。您不能null作为第一个参数传递给Array.newInstance; 你需要一个实际的课程。一种方法是:

public class StackArray<E> implements Stack<E>{
    private E st[];
    private int top=-1;
    public StackArray(Class<E> type, int n) {
        st=(E[]) Array.newInstance(type, n);
    }
}

您需要使用实际类型调用它,而不是null. 例如:

StackArray<Integer> stack = new StackArray<>(Integer.class, 20);

您还可以将构造函数声明为

    public StackArray(Class<? extends E> type, int n) {

但我认为这没有多大优势(以及一些风险)。

但是,一般来说,将数组与泛型混合是一个坏主意。我建议你重新考虑你的设计。

于 2013-10-13T16:08:49.573 回答
0

您不能在 Java 中创建泛型数组。

NullPointerException因为这条线,你得到了一个:

Array.newInstance(null, n);

来自该方法的Javadoc

Parameters:
    componentType - the Class object representing the component type of the new array
    length - the length of the new array
Returns:
    the new array
Throws:
    NullPointerException - if the specified componentType parameter is null
    IllegalArgumentException - if componentType is Void.TYPE
    NegativeArraySizeException - if the specified length is negative

您可以看到它声明它将抛出一个NullPointerExceptionif componentTypeis null

一种技巧是创建一个Object[]然后转换它:

public StackArray(int n){
    st=(E[]) new Object[n];
}

我说黑客是因为这太可怕了,应该避免。您可以做的最好的事情是使用 java 集合 API 并将您的类更改为

public class StackArray<E> implements Stack<E>{
    private List<E> st;
    private int top=-1;

    public StackArray(int n){
        st = new ArrayList<E>(n);
    }

    //...
}
于 2013-10-13T16:10:53.807 回答