- 为什么要有泛型Generic?
解决数据类型的安全性问题,其主要原理是在类声明时通过一个标识表示类中某个属性的类型或者是某个方法的返回值及参数类型。这样在类声明或实例化时只要指定好需要的具体的类型即可。
在集合中使用泛型时,只有指定类型才能添加到集合中。 - JAVA中的泛型,只在编译阶段有效
在编译过程中,正确检验泛型结果后,会将泛型的相关信息擦出,并且在对象进入和离开方法的边界处添加类型检查和类型转换的方法。也就是说,泛型信息不会进入到运行时阶段。 -
泛型类
实例化泛型类时,如果不指定泛型,默认泛型是object
- 泛型接口
泛型的作用是确定接口里某个变量的类型
//定义一个泛型接口
interface Generator<T> {
T next();
}
类实现接口的时候,未传入泛型实参时,与泛型类的定义相同,在声明类的时候,需将泛型的声明也一起加到类中。
即:class FruitGenerator<T> implements Generator<T>{}
在实现类实现泛型接口时,如已将泛型类型传入实参类型,则所有使用泛型的地方都要替换成传入的实参类型
- 即:Generator<T>,public T next();中的的T都要替换成传入的String类型。
- 泛型方法
泛型方法的格式:
public class DAO {
public <E> void show(E e){
System.out.println(e.toString());
}
public <T> T show1(T t){
return t;
}
}
泛型方法在调用时,没有固定的数据类型
静态方法无法访问类上定义的泛型;
- 如果静态方法操作的引用数据类型不确定的时候,必须要将泛型定义在方法上
- 通配符
/**
- 不确定集合中的元素具体的数据类型
- 使用?表示所有类型
- @param list
*/
public void test(List<?> list){
System.out.println(list);
}
有限制的通配符:
举例:
<? extends Person> (无穷小 , Person]
只允许泛型为Person及Person子类的引用调用
<? super Person > [Person , 无穷大)
只允许泛型为Person及Person父类的引用调用
<? extends Comparable>
只允许泛型为实 现Comparable接口的实现类的引用调用