泛型
泛型类型的参数类型必须是引用类型
如 ArrayList<int> list = new ArrayList<int>(); //错误
ArrayList<Integer> list = new ArrayList<Integer>(); //正确
list.add(5); //正确 自动打包(装箱)机制
int i = list.get(0); //正确,如果元素是包装类型,如Integer,Double,Character,可以直接将这个元素赋给一个基本类型的变量。这个过程称为自动拆箱机制
- 定义泛型类
import java.util.ArrayList; public class GenericStack<E> { private ArrayList<E> list = new ArrayList<E>(); public boolean isEmpty() { return list.isEmpty(); } public int getSize() { return list.size(); } public E peek() { return list.get(getSize() - 1); } public E pop() { E o = list.get(getSize() - 1) ; list.remove(getSize() - 1); return o; }public void push(E o) { list.add(o); } public String toString() { return "stack: " + list.toString(); }}
GenericStack擦除参数类型后的构造函数形式是 GenericStack( ),不是GenericStack<>();
泛型类如果有多个参数类型,则将多个参数放在一个尖括号中,如<E1,E2,E3>。
可以定义类或者接口作为泛型类或者泛型接口的子类型,如Java API中,Java.lang.String类实现Comparable接口的写法是: public class String implements Comparable<String>;
可以将泛型指定为另外一种类型(或泛型)的子类型,这样的泛型类型称之为受限的
public class BoundedTypeDemo{
public static <E extends GeometricObject> boolean equalArea(E object1, E object2 )
{
return object1.getArea() == object2.getArea( );
}
}
注意: 泛型类型放置的位置,应放在方法的返回类型之前(定义泛型方法)或者类名之后(定义泛型类时)
- 原始类型
可以使用泛型的原始类型(Generic)而无需指定具体类型。如:
GenericStack stack = new GenericStack( ); 等价于
GenericStatck<Object> stack = new GenericStack<Object>( );
这种不带类型参数的GenericStack泛型类称为原始类型。使用原始类型可以向后兼容Java的早期版本。如Comparable类型
- 通配泛型
三种形式:
? , 非受限通配,等价于 ? extends object
? extends T, 受限通配,表示T或者T的子类
? super T,下限通配,表示T或者T的父类型
原文地址:https://www.cnblogs.com/jing-yu/p/9061730.html