九、泛型

来源:互联网 发布:js 解压缩 编辑:程序博客网 时间:2024/04/30 19:58
九、泛型
    
    泛型两大特性:擦除(出现限制)和不协变(出现通配符)

    1)限制条件:
        1.不能使用基本类型
             原因:因为Object类型不能储存如double的值。
        2.不能抛出也能不捕获泛型类型实例
             原因:Java编译器已限制。
        3.参数化类型的数组  如:A<String> a = new A<String>() ;
             原因:擦除的时候会将A<String>转化为Object,故把参数丢失了。
        4.运行时类型查询只适用于原是类型
             原因:因为运行时Java虚拟机中的对象总是一个特定的非泛型类型。如a instanceof A<String>仅仅判断a是否属于A,而不是A<String>。

    2)使用方式:
            ①<?>
            ②<T>
            ③<? extends A>  限制了?的上限,即?必须是A或A的子类
            ④<T extends A>  限制了T的上限,即T必须是A或A的子类   
            ⑤<? super A>      限制了?的下限,即?必须是A或A的父类
            ⑥<T super A>      限制了T的下限,即T必须是A或A的父类

        问题一:为什么出现通配符(?)?
     原理:泛型是不协变的(数组是协变的):因为类型参数(T)使用必须是一个类型,当出现List<Integer>与List<Number>相互赋值的时候,使用类型参数(T)将会报错,尽管Integer是Number的子类。因为类型参数已经设                置准确的类型是List<Integer>。当使用通配符的时候,将会解除这个限制 如Collection中的addAll()。
               addAll():interface Collection<E>{
                                    public boolean addAll(Collection<? extends E> c) ;
                                }
0 0
原创粉丝点击