本人是小菜一枚,在上的算法课要用到JAVA实现。
其中讲到栈的时候,用到了泛型编程,代码如下
public class raStack<Item>{
private int N;
private Item[] s;
public raStack() { s = (Item[]) new Object[1]; }
public void push(Item item) {
if(s.length == N) resize(2 * s.length);
s[N++] = item;
}
public Item pop() {
Item item = s[--N];
s[N] = null;
if(N > 0 && N == s.length / 4) resize(s.length / 2);
return item;
}
public void resize(int capacity) {
Item[] copy = (Item[]) new Object[capacity];
for(int i = 0;i < N; i++)
copy[i] = s[i];
s = copy;
}
public static void main(String[] args) {
raStack<String> r = new raStack<String>();
}
}
其中s = (Item[]) new Object[1];
这里,为什么不能直接用 s = new Item[1]; ?
求大神讲解。
------解决思路----------------------
Java编程思想上解释为类型擦除。
我的理解:
Item是某个类型,该类型在未创建泛型类时,是不确定的(不知道是那个class类),Java中的new对象必须是明确已知的对象,就是说必须要有class文件与之对应,而这里你直接new Item[1],Item对应哪个class文件JVM并不知道,所以是不对的;但Item是一个类型这一点是确定的并且只能是一种类型,而Java支持类型转换,你可以将某个类型强制转换为另一种类型,所以s = (Item[]) new Object[1];是可以的,也是唯一的方式。