从通用数组转换到我的类?

时间:2015-09-24 02:27:29

标签: java

我有一个泛型类SimpleStack<T>,它包含以下方法:

private T[] stack;

public T[] getStack() {
    return this.stack;
}

public boolean add(T item) {
    boolean filled = isFull();
    if (!filled) {
        stack[size()] = item;
        return true;
    }
    else {
        return false;
    }
}

public int size() {
    int count = 0;
    for (T item : stack) {
        if (item != null) {
            count++;
        }
    }
    return count;
}

我正在尝试使用此类充当Profile类,并且已使用stack对象填充数组Profile。但是,当我尝试返回此数组时,它表示无法从Object转换为Profile

这是我在主方法中填充数组的片段:

SimpleStack<Profile> profiles = new SimpleStack<Profile>(50);
Profile profile = new Profile();
profiles.add(profile);

我尝试调用getter返回数组,然后将其转换为Profile[]。这是失败的:

Profile[] tempStack = Arrays.copyOf(profiles.getStack(), (profiles.getStack()).length, Profile[].class);

我已经尝试了几种方法,但最终都做了同样的事情(尝试将通用数组转换为Profile[])。

有谁知道我做错了什么?如有必要,我可以提供更多代码。我试着拿相关的位。

2 个答案:

答案 0 :(得分:0)

这完全取决于你如何初始化它。有关详细信息,请参阅How to create a generic array in Java?

public class SimpleStack<T> {
    private final T[] stack;

    public SimpleStack(Class<T[]> clazz, int size) {
        this.stack = clazz.cast(Array.newInstance(clazz.getComponentType(), size));
    }

    public T[] getStack() {
        return stack;
    }

    public static void main(String... args) {
        SimpleStack<Profile> profiles = new SimpleStack<>(Profile[].class, 50);
        Profile profile = new Profile();
        Profile[] array = profiles.getStack();
    }

    public static class Profile {

    }
}

请注意,我更喜欢使用clazz.cast()代替脏演员,因为它更安全,您不必使用@SuppressWarnings

答案 1 :(得分:0)

这个,stack = (T[]) new Object[size];是不允许的。由于type-erasureT 类型在运行时为 Object。但是,您可以将class类型传递到通用类,这样您就可以使用Array.newInstance(Class, int)

static <E> E[] makeAnArray(Class<E> cls, int length) {
    return (E[]) Array.newInstance(cls, length);
}