1. 为什么要有泛型
问题:
- 类型不安全,list里面啥都能存,什么int啊,string啊
- 强转时,可能出现ClassCastException:其他类型的强转失败了~
package com.ran;
//自定义泛型类
public class Order<T> {
String name;
int orderId;
//类的内部结构就可以使用类的泛型
T orderT;
public Order() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getOrderId() {
return orderId;
}
public void setOrderId(int orderId) {
this.orderId = orderId;
}
public T getOrderT() {
return orderT;
}
public void setOrderT(T orderT) {
this.orderT = orderT;
}
public Order(String name, int orderId, T orderT) {
this.name = name;
this.orderId = orderId;
this.orderT = orderT;
}
}
2. 使用泛型
-
集合接口或者集合类在JDK5.0时都修改为带泛型的结构
-
在实例化的集合类时,可以指明具体的泛型类型,指明完以后,在集合类或者接口中凡是定义类或接口,内部结构使用到类的泛型的位置,都指定为实例化的泛型类型。
比如:add(E e) -----------> 实例化之后,add(Integer e)
-
注意一点:泛型的类型必须是一个类,不能是基本数据类型,我们需要用到基本数据类型的位置,拿包装类替换
-
如果实例化时,没有指明泛型的类型,默认这个类型为Object类型
-
JDK7类型推断:在new后面的泛型也可以不写,它自动推断前面的泛型
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(78);
list.add(88);
list.add(69);
list.add(100);
Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()){
Integer next = iterator.next();
System.out.println(next);
}
}
3. 自定义泛型类举例
-
子类在继承带泛型的父类时,如果指明了泛型类型,则实例化子类对象的时候就不再需要指明泛型,不再是泛型类
public class qqq extends Order<Integer> { }
-
子类在继承带泛型的父类时,如果未指明泛型类型,则实例化子类对象的时候需要指明泛型,仍然是泛型类
public class qqq<T> extends Order<T> { }
-
泛型不同的引用不可以相互赋值
ArrayList<String> list1=null; ArrayList<Integer> list2=new ArrayList<Integer>(); //不可赋值 list1=list2;
-
静态方法中不可以使用类的泛型
public static void show(T orderT){ System.out.println(orderT); //报错 }
-
不可放异常中,编译不通过
try { }catch (T t)
-
T类型的数组创建
//T[] arr=new T[10]; //编译不通过 T[] arr=(T[])new Object[10];
-
子类父类泛型保留情况