泛型的理解和一些方法

来源:互联网 发布:ai设为像素级优化 编辑:程序博客网 时间:2024/06/05 01:13
泛型类可以接收所有类型的对象
但定义时必须指定具体接收哪种对象,这样在泛型添加对象时如果发生
添加的对象不是定义时指定的对象,编译时就会出错。以便于程序员及时修正错误。

泛化类型作为参数存在于方法中,可以为功能相同,但只是数据结构不同的对象提供一个
统一的操作。

泛型中的子类问题

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>





 










 

0 0