下面给出一个简单的泛型堆栈的实现(不考虑实现的完备性,主要看泛型)。
public class MyStack<E> {
private E[] elements;
private int size = 0;
private static final int DEFAULT_INITIAL_CAPACITY = 16;
public MyStack() {
elements = (E[]) new Object[DEFAULT_INITIAL_CAPACITY]; // sign1:
System.out.println(elements.length);
}
public void push(E e) {
elements[size++] = e;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
MyStack<String> myStack = new MyStack<String>(); // sign2
myStack.push("String1");
}
}
elements的编译时类型为E[],而MyStack<String> myStack = new MyStack<String>()将泛型类MyStack的类型参数T设置为String,此时千万不要认为elements的运行时类型为String[],如果是String[]的话,则elements = (E[]) new Object[DEFAULT_INITIAL_CAPACITY]必然出错,而上面的代码是可以运行的。其实elements的运行时类型是Object[],具体原因和泛型的擦除有关。所以这里的强制类型转换既保证了编译时的类型一致,也保证了运行时的类型一致。