泛型矩阵类
泛型小结
⦁ 泛型具有参数化类型的能力。可以定义使用泛型类型的类或方法,编译器会用具体的类型来替换泛型类型。
⦁ 泛型的主要优势是能够在编译时而不是运行时检测错误。
⦁ 泛型或方法允许指定这个类或方法可以带有的对象类型。如果试图使用带有不兼容对象的类或方法,编译器会检测出这个错误。
⦁ 定义在类、接口或者静态方法中的泛型称为形式泛型类型,随后可以用一个实际具体类型来替换它。替换泛型类型的过程称为泛型实例化。
⦁ 不使用类型参数的泛型类称为原始类型,例如Arraylist。使用原始类型是为了向后兼容java较早的版本。
⦁ 通配泛型类型有三种形式:?、?Extends T 和 ?Super T,这里的T代表一个泛型类型。第一种形式?称为非受限通配,它和?Extends Object 是一样的。第二种形式?Extends T称为受限统配,代表T或者T的一个类型。第三种类型?Super T 称为下限通配,代表T或者T的一个父类型。
⦁ 使用称为类型消除的方法来实现泛型。编译器使用泛型类型信息来编译代码,但是随后消除它。因此泛型信息在运行时是不可用的。这个方法能够使泛型代码向后兼容使用原始类型的遗留代码。
⦁ 不能使用泛型类型参数来创建实例。
⦁ 不能使用泛型类型参数来创建数组。
⦁ 不能在静态环境中使用类的泛型类型参数。
⦁ 在异常类中不能使用泛型类型参数。
用数组实现泛型栈
public class GenericStack2<E> {
public final static int INITIAL_SIZE = 16;
private E[] elements;
private int size;
public GenericStack2(){
this(INITIAL_SIZE);
}
public GenericStack2(int initialCapacity){
elements = (E[])new Object[initialCapacity];
}
public E push(E value){
if(size >= elements.length){
E[] temp = (E[]) new Object[elements.length*2];
System.arraycopy(elements,0,temp,0,elements.length);
elements = temp;
}
return elements[size++] = value;
}
public E pop(){
return elements[--size];
}
public E peek(){
return elements[size-1];
}
public boolean isEmpty(){
return size == 0;
}
public int getSize(){
return size;
}
}