Java 泛型

基本概念

泛型是JDK1.5后引进的一种机制。
如果除去对象的基本类型外,其实现的方法是相同的,那么就可以用泛型机制来描述该功能。
可以看成是一种安全机制,主要应用于在编译期发现类型转换异常ClassCastException,以减少麻烦的“运行时异常”。


类型檫除与补偿

编译时会将泛型的类型转换为非泛型类(即该泛型的原始类),该过程称为“泛型擦除”。
例如:List,List都会转换为List。
ArrayList,ArrayList都会转换为ArrayList。
那泛型被檫除后,又如何完成隐式地类型转换呢?
泛型被转换为原始类时,并不是把所有类型信息完全地去除,编译器会保留一些泛型类型信息,用于实现类型的隐式转换。这个过程就叫做“补偿”。


通配符

泛型中可用“?”来表示未知的具体类型实参。
通配符上限:”? extends anyclass “ 表示 该类及其子类。
通配符下限:”? Super anyclass “ 表示 该类及其父类。

注:
通配符,在某种程度上说,是为了弥补泛型的不足。
何为泛型的不足呢?
上文提到的类型檫除与补偿就是关键。例如:
假设Person类是Student类的父类。
List<Student> IS-A List<Person>吗?逻辑上是,但实际上不是。
List<Person> = List<Student>;
该语句会出现编译错误,虽然二者都会被檫除为List,但它们各自会保留本身的一些类型信息,所以二者是不同类型,不存在父与子的关系。

这种做法虽然保证了泛型的安全性,但是却失去了其灵活性。通配符的引入就是为了解决这个问题。


泛型应用(举例说明)

泛型接口
public interface List <E> 
{
    void add(E x);
    Iterator<E> iterator();
}
泛型类与方法
class Box<T> {

    private T data;

     public Box() {
     }

     public Box(T data) {
         this.data = data;
     }

     public T getData() {
         return data;
     }

 } 

尖括号中包含的是形式类型参数(formal type parameters),它们就如同一般的类型一样,可以在整个类的声明中被使用。当类被使用时,会使用具体的实际类型参数(actual type argument)代替。


泛型注意事项

1.不能创建一个泛型类的实例
2.不能创建一个确切泛型类型的数组。
3.泛型类中的static 域是该泛型实例共享的。
4.不能创建一个泛型的数组。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值