泛型:
java5开始出现的一种对Java语言类型的一种拓展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数类型时指定的类型占位符,就好比方法的形式参数是实际参数的占位符一样.(将类型<比如java.lang.String>当作参数传递给一个方法)
定义泛型类
public class Point<T,P> { //T是一个标示符,代表一个变量类型,调用时可传入一个包装类的类名
/**类型参数规范:推荐使用规范-常见的泛型;泛型只保存在源文件中,class文件中不存在,也就是说在编译阶段就会丢失;基本数据类型不能作为泛型类型;
K 键,比如映射的键 key的类型
V 值,比如Map的值 value类型
E 元素,比如Set<E> Element表示元素,元素的类型
T 泛型,Type的意思*/
private T x; //Q代表调用时传入的数据类型,没有传入参数时,默认为Object
private P x;
public void setX(T x) {
this.x = x;
}
public T getX() {
return x;
}
}
使用泛型类
Point<Double,Integer> p = new Point<Double,Integer>(); //定义具体类型,第二个括号里的参数可不写(7开始)
p.setX(1.1);
Double d = p.getX();//已经确定返回的参数是一个Double类型,不需要强转
Point p = new Point();
p.setX(1.1);
Double d = (Double)p.getX();//返回的是一个Object对象,需要强转为Double
泛型的上限与下限
List<?> l
仅表示各种泛型List的父类,并不能把元素添加入集合中;
public void show(List<?> list){}
表示可接受任意类型的List集合作为参数;
List<? extends 类名>
可接受类名及其子类的实例对象作为元素;
List<? super 类名>
可接受类名及其父类的实例对象作为元素;
泛型的的继承
Object obj = new Person();//√
Person<Object> p = new Person<String>();//×
泛型接口及实现方法
public interface IDAO<T>{}
public class DaoImpl<T> implements IDAO<T>{}
public class DaoImpl implements IDAO<String> {}
泛型方法
public static <T>T show (T t ){ return t; }
public static <T>T show (T[] ts ){ return ts[0]; }
public static <T>T show (T...] ts ){ return ts[0]; }
泛型嵌套
Map<String,String> map = new HashMap<>();
Set<Map<String,String> > set = map.entrySet();//将一个已经定义过泛型的Map类作为参数传递给Set的泛型占位符
泛型擦除
Java泛型的处理几乎都在编译器中进行,编译器生成的bytecode是不包涵泛型信息的,泛型类型信息将在编译处理是被擦除,这个过程即类型擦除。
带来的问题:
public void test(List<String> ls){ };public void test(List<Integer> li){ }'方法前面相同,编译会报错;
GenericException 和GenericException`
泛型类的静态变量是共享的;
不需要同时catch同一个泛型异常类的多个实例,
是一样的