泛型类可以接收所有类型的对象
但定义时必须指定具体接收哪种对象,这样在泛型添加对象时如果发生
添加的对象不是定义时指定的对象,编译时就会出错。以便于程序员及时修正错误。
泛化类型作为参数存在于方法中,可以为功能相同,但只是数据结构不同的对象提供一个
统一的操作。
泛型中的子类问题
class Animal{
public void feed(){}
}
class lion extends Animal{
public void feed(){
System.out.print("feed lion");
}
}
Arraylist<Animal> 并不能作为Arraylist<lion>的父类
所以
如果有这样一个方法
public void feedAnimal(Arraylist<Animal> animal){
}
此时,Arraylist<lion>类型不能作为参数传递到这个方法中
但是Arraylist<Animal>中添加元素时可以add(new Lion())
因为Animal是Lion的父类
要想上面的feedAnimal()方法里的参数可以传递任意Animal子类的集合
可采用如下的方法
使用?通配符
public void feedAnimal(Arraylist<? extends Animal> animal){
}
这时Arraylist<? extends Animal>是任意的Arraylist<animal子类>的父类
这是一种受限的通配符使用,也就是说<>里只能使用一种类型的最顶端父类
及其子类,当然是受到其最顶端的父类的限制
另一种受限通配符使用是Arraylist<? super Animal>那么此时传入到<>里的参数
必须是Animal的父类。
最后一种是不受限的。
Arraylist<?>其实它相当于Animal<? extends Object>
作为Object的子类,不就是java中所有的类吗?那就没什么限制了。
泛化方法
public <T> void get(T t){
}
由上面的一个例子可以看出,泛化方法与普通的方法区别是()里的参数使用
泛化字符。对参数进行了一个声明。
如果参数是集合类型,当然可以对集合里的元素进行受限控制,如上面所讲到的。
类型擦除
java中并没有并没有泛型类型,没有什么T类,U类什么的
类型擦除就是把这些乱七八糟的东西去掉。
擦除规则1
泛型中所有对类型变量的引用都替换为类型变量的最近上限类型
举例
Arraylist<T extends Animal>擦除后变为Arraylist<Animal>
Arraylist<T>变为Arraylist<Object>