我有一个泛型类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[]
)。
有谁知道我做错了什么?如有必要,我可以提供更多代码。我试着拿相关的位。
答案 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-erasure,T
类型在运行时为 Object
。但是,您可以将class
类型传递到通用类,这样您就可以使用Array.newInstance(Class, int)
。
static <E> E[] makeAnArray(Class<E> cls, int length) {
return (E[]) Array.newInstance(cls, length);
}