1. 泛型是向类或接口或方法传递类型;泛型引入的目的是把类型检查放在编译期。
2.泛型在最终会擦除为Object
类型。这样导致的是在编写泛型代码的时候,对泛型元素的操作只能使用Object
自带的一些方法,但是有时候我们想使用其他类型的方法呢?
比如:
public class Node{
private People obj;
public People get(){
return obj;
}
public void set(People obj){
this.obj=obj;
}
public void playName(){
System.out.println(obj.getName());
}
}
如上,代码中需要使用obj.getName()
方法,因此比如规定传入的元素必须是People
及其子类,那么这样的方法怎么通过泛型体现出来呢?
答案是extends
,泛型重载了extends
关键字,可以通过extends
关键字指定最终擦除所替代的类型
public class Node<T extends People>{
private T obj;
public T get(){
return obj;
}
public void set(T obj){
this.obj=obj;
}
public void playName(){
System.out.println(obj.getName());
}
}
通过extends
关键字,编译器会将最后类型都擦除为People
类型,就好像最开始我们看见的原始代码一样。
注意:<? extends Fruit>不能写成<E extends Fruit>
3.
泛型与向上转型的概念
先讲一讲几个概念:
- 协变:子类能向父类转换
Animal a1=new Cat();
- 逆变: 父类能向子类转换
Cat a2=(Cat)a1;
- 不变: 两者均不能转变