1.定义
Java的泛型:创建集合容器时规定其允许保存的元素类型,
然后又编译器负责添加元素的类型合法性检查,
在取用几何元素时则不必再进行造型处理。
例如:
1 List list = new List();//没使用泛型之前,可以存储任何类型, 2 //取用元素的时候也得进行造型(强制类型转换) 3 String a = (String)list.get(1); 4 5 //被附加了特别的约束条件,只能添加指定的类型的元素 6 List<String> list = new List<String>(); 7 list.add(new Date());//报错,不能加入非String类型的元素 8 String a = list.get(1);//不用再进行造型
2.泛型向后兼容
由于泛型是JDK中后面新加入的特性,
所以为了向过去兼容,新的编译器编译旧程序会出现警告
可以通过使用 SuppressWarnings注解关闭编译提示信息
eg:
1 import java.util.*; 2 import java.lang.SuppressWarnings; 3 4 @SuppressWarnings({"unchecked"}) 5 public class TestSuppressWarnings{ 6 public static void main(String[] args){ 7 Vector v = new Vector(); 8 v.addElement("Tom"); 9 v.addElement(new Date()); 10 } 11 }
3.泛型类:有类型参数修饰的类型成为泛型类
格式:数据类型<类型参数>
eg:
public class Vector<E>{
public void addElement(E obj){
}
}
3.1.定义自己的泛型类
1 //尖括号内的T相当于方法中的形参,可以任意取名 2 public class Person<T>{ 3 public final int id; 4 private T secrecy; 5 6 public Person(int id){ 7 this.id = id; 8 } 9 10 public int getId(){ 11 return id; 12 } 13 14 public T getSecrecy(){ 15 return secrecy; 16 } 17 18 public void setSecrecy(T secrecy){ 19 this.secrecy = secrecy; 20 } 21 }
4.泛型进阶:
4.1.同一个泛型类搭配不同的类型参数复合而成的类型属于同一个类,
但却是不同的类型(总之,泛型就是一种特殊的类型)
eg:
Vector<String> 与 Vector<Double> 就不是同一类型
4.2.同一个泛型类于不同的类型参数复合而成的类型间并不存在继承关系,
即使是类型参数间存在继承关系是也是如此(否则会乱套)
eg:
1 public class Test{ 2 public static void main(){ 3 Vector<String> v = new Vector<String>(); 4 v.add("Tom"); 5 Vector<Object> v1 = v;//尽管String是Object子类,但此处却会报错 6 v1.add(new Date());//这里就导致v的约束String类型,所以是不允许的 7 } 8 9 }
5.类型通配符“?”
使用“?”作为类型参数
5.1. Vector<?>是任何泛型Vector的父类型
5.2. Vector<?>类型的变量在调用方法时是受限制的--凡是必须知道具体类型参数才能进行的操作均被禁止
6.受限制的通配符(约束更严格)
eg:
public class Test<T extends Number>{//这里的T附加了必须继承Number类的条件
}