泛型:
为什么用泛型?
1.因为在集合中可以使用泛型来保证数据类型的安全性,即能在编译时区分是否是相同类型
泛型的分类:1.泛型类 2.泛型接口 3.泛型方法
1.泛型类:T只能是类不能是基本数据类型
public class A<T>{
T t;
public void show(T t){}
}
2.泛型方法:定义在限定符public 以及static后面,放在返回值前面
public static <T> void show(T t){}
也可以 public static <T> t show(T t){}
调用泛型方法 A.<String>show("naem"); 或者可以省略A.show("naem");
3.泛型接口:
public interface B<T>{}
public class A<T> implements B<T>{}//接口不指定类型,实现类也不指定,创建对象时创建;
public class A implements B<String>{}//接口指定类型
二:泛型类型限定
1.<T extends Comparable & Serializable>:泛型类型限定,即T只能是实现Comparable和Serializable的子类或者本身
含义是T是实现Comparable Serializable 多个接口用& enxtends表示继承或者实现
2.1.<T super A>:泛型类型限定,即T只能A的父类或者A
三:类型擦除(擦除泛型,虚拟机只支持普通类型)
在虚拟机时没有泛型即,会将泛型转换成限定类型(使用限定类型中列表首位,即第一个限定类型),例如(<T extends Comparable & Serializable>)没有限定类型则转换成object
1.没有限定类型:
比如:public class A<T>{
T t;
public void show(T t){}
}
擦除类型后是:public class A{
Object t;
public void show(Object t){}
}
2.有限定类型:
public class A<T extends Comparable & Serializable>{
T t;
public void show(T t){}
}
擦除类型后是:public class A{
Comparable t;
public void show(Comparable t){}
}
3.泛型方法
public static <T extends Comparable & Serializable> T show(T t){}
擦除类型后是:
public static Comparable show(Comparable t){}
四:泛型约束
T又称类型变量
1.泛型只适用于类不适用基本数据类型
2.泛型运行时类型查询只适用于原始类型
比如 a instanceof A<String> 以及 A<String> aa = (A<String>)a,编译器会报错,
同样A<String> a; A<B> b; a.getClass()==b.getClass(),因为它们都是A.class
3.不能实例化泛型参数类型数组
A<String> a = new A<String>[0]是错误的,虚拟机擦除类型后数组A a = new A[];不能再插入String类型
4.不能实例化泛型例如new T();是错误的,
5.静态方法中不能使用类型变量或者静态方法引用类型变量,因为类型变量编译时擦除
6.不能抛出或者捕获泛型类 例如public class A<String> extents Exception是错误的,并且在cache块中不能捕获泛型对象
7.泛型重视不存在继承关系的
五:通配符?
1.? extends A (限定? 为A或者A的子类,上限)(只能读数据) ? super A (限定为A或者A的父类,下限)(只能写数据)
?与T区别
1.1?不能操作类型特有的方法,而T可以,因为?不确定
2.?可以单独存在 而T要不然在类中定义,要不然在方法中
3.?可以用于实参的泛型即
List<Person> person ;
List<Student> student;
public void show(List<? extends Person>){} 可以传入student 或者Person
public <T> void show(List<T extends Person>){}可以传入student 或者Person
同上
2.在类中不能使用 ? a,作为类型变量
3.通配符用于变量声明 变量赋值 参数 例如 List<? extends A> a; List<? extends A> a = new ArrayList<String>(); public void show(List<? extends A> a){}
4.作为参数时主要用于可以传递不同泛型实例
为什么用泛型?
1.因为在集合中可以使用泛型来保证数据类型的安全性,即能在编译时区分是否是相同类型
泛型的分类:1.泛型类 2.泛型接口 3.泛型方法
1.泛型类:T只能是类不能是基本数据类型
public class A<T>{
T t;
public void show(T t){}
}
2.泛型方法:定义在限定符public 以及static后面,放在返回值前面
public static <T> void show(T t){}
也可以 public static <T> t show(T t){}
调用泛型方法 A.<String>show("naem"); 或者可以省略A.show("naem");
3.泛型接口:
public interface B<T>{}
public class A<T> implements B<T>{}//接口不指定类型,实现类也不指定,创建对象时创建;
public class A implements B<String>{}//接口指定类型
二:泛型类型限定
1.<T extends Comparable & Serializable>:泛型类型限定,即T只能是实现Comparable和Serializable的子类或者本身
含义是T是实现Comparable Serializable 多个接口用& enxtends表示继承或者实现
2.1.<T super A>:泛型类型限定,即T只能A的父类或者A
三:类型擦除(擦除泛型,虚拟机只支持普通类型)
在虚拟机时没有泛型即,会将泛型转换成限定类型(使用限定类型中列表首位,即第一个限定类型),例如(<T extends Comparable & Serializable>)没有限定类型则转换成object
1.没有限定类型:
比如:public class A<T>{
T t;
public void show(T t){}
}
擦除类型后是:public class A{
Object t;
public void show(Object t){}
}
2.有限定类型:
public class A<T extends Comparable & Serializable>{
T t;
public void show(T t){}
}
擦除类型后是:public class A{
Comparable t;
public void show(Comparable t){}
}
3.泛型方法
public static <T extends Comparable & Serializable> T show(T t){}
擦除类型后是:
public static Comparable show(Comparable t){}
四:泛型约束
T又称类型变量
1.泛型只适用于类不适用基本数据类型
2.泛型运行时类型查询只适用于原始类型
比如 a instanceof A<String> 以及 A<String> aa = (A<String>)a,编译器会报错,
同样A<String> a; A<B> b; a.getClass()==b.getClass(),因为它们都是A.class
3.不能实例化泛型参数类型数组
A<String> a = new A<String>[0]是错误的,虚拟机擦除类型后数组A a = new A[];不能再插入String类型
4.不能实例化泛型例如new T();是错误的,
5.静态方法中不能使用类型变量或者静态方法引用类型变量,因为类型变量编译时擦除
6.不能抛出或者捕获泛型类 例如public class A<String> extents Exception是错误的,并且在cache块中不能捕获泛型对象
7.泛型重视不存在继承关系的
五:通配符?
1.? extends A (限定? 为A或者A的子类,上限)(只能读数据) ? super A (限定为A或者A的父类,下限)(只能写数据)
?与T区别
1.1?不能操作类型特有的方法,而T可以,因为?不确定
2.?可以单独存在 而T要不然在类中定义,要不然在方法中
3.?可以用于实参的泛型即
List<Person> person ;
List<Student> student;
public void show(List<? extends Person>){} 可以传入student 或者Person
public <T> void show(List<T extends Person>){}可以传入student 或者Person
同上
2.在类中不能使用 ? a,作为类型变量
3.通配符用于变量声明 变量赋值 参数 例如 List<? extends A> a; List<? extends A> a = new ArrayList<String>(); public void show(List<? extends A> a){}
4.作为参数时主要用于可以传递不同泛型实例