泛型:类型的参数化。就是定义类、接口时,可以将要使用到的某个数据类型定义成一个参数,在真正使用类或接口时再去确定
- 如果泛型类使用么有指定的类型,那么泛型将为Object类型
 
- 实现泛型接口,并且确定泛型的类型,这样这个类就不是泛型类
 
- 定义一个子类继承泛型接口或者泛型类时,泛型的类型依旧不能确定,那么就得在子类上再次定义泛型,表示在使用子类时去明确泛型的类型,这样子类就是泛型类
 
- 泛型类、接口,泛型的个数可以有多个,用逗号隔开
 
- 泛型方法
 
- 注意:不能创建泛型数组,T[] t = new T[5]; 编译不通过
 
泛型类
泛型类,尖括号中是一个类型的参数,在使用类时再明确具体的类型
泛型类中可以使用这个类型的参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
   | public class Data<T> { 	String name; 	int age; 	 	T x; 	public Data(String name,int age,T x) { 		this.name = name; 		this.age = age; 		this.x = x; 	} 	 	public void setX(T x) { 		this.x = x; 	}	 	 	public T getX() { 		return x; 	}	 	 	 	public <E> E func(E e) {	 		return e;	 	} }
  | 
 
泛型接口
1 2 3 4 5 6 7
   | 
 
  public interface MyInterface<T,V>{
  	public void func(T t,V v); }
 
  | 
 
1 2 3 4 5 6 7 8 9
   | 
 
  public class SubClass implements MyInterface<String, Integer> {
  	@Override 	public void func(String t, Integer v) {	 	} }
 
  | 
 
泛型方法
1 2 3 4 5 6 7 8 9 10 11
   | Data<Integer> d1 = new Data<Integer>("abc", 20, 10); d1.setX(500); 	
 
  Integer res =  d1.func(100); String res2 = d1.func("abc");
 
  Data d2 = new Data("aaa", 20, 2); d2.setX("object");
  | 
 
通配符
有的时候想定义一个方法,里面的参数是一个集合对象,但是集合的泛型又不太确定
?:代表泛型的通配符,参数链表中的泛型将可以为任意的
通配符范围的限定: 
- ? extends X:泛型必须是X本身或者其子类
 
- ? super X:泛型必须是本身或者X的父类
 
1 2 3 4 5 6 7 8 9 10 11
   | private void f1(List<?> list) {               
       Object data = list.get(0);   System.out.println(data); }
  |