Java泛型(二)

泛型通配符

1.什么是类型通配符

类型通配符一般是使用"?"代替具体的类型实参。

所以,类型通配符是类型实参,而不是类型形参。

如何理解这里说的实参呢,因为泛型是将类型参数化了,所以类型通配符是类型实参

2.类型通配符的上限

语法:

类/接口<? extends 实参类型>

要求该泛型的类型,只能是实参类型,或实参类型的子类类型。

规定参数继承自 实参类型

上限通配符,集合 不能填充元素

3.类型通配符的下限

语法:

类/接口<? super 实参类型>

要求该泛型的类型,只能是实参类型,或实参类型的父类类型。

下限通配符,集合 可以填充元素

代码示例

public class Box<E> {

    private E first;

    public E getFirst() {
        return first;
    }

    public void setFirst(E first) {
        this.first = first;
    }
}


    /**
     * 通配符:表示任意类型
     * @param box
     */
    public static void showBox1(Box<?> box){

        Object first = box.getFirst();
        System.out.println(first);
    }
    /**
     * 上限通配符 规定参数继承自 Number,想想多态
     * @param box
     */
    public static void showBox(Box<? extends Number> box){
        //上限通配符,集合 不能填充元素

        Number first = box.getFirst();
        System.out.println(first);
    }

    /**
     * 下限通配符 ,规定只能是Number或者Number的父类
     * @param box
     */
    public static void showBox2(Box<? super Number> box){
        //下限通配符,集合 可以填充元素

        Object first = box.getFirst();
        System.out.println(first);
    }

类型擦除

泛型是Java 1.5版本才引进的概念,在这之前是没有泛型的,但是泛型代码能够很好地和之前版本的代码兼容。那是因为,泛型信息只存在于代码编译阶段,在进入JVM之前,与泛型相关的信息会被擦除掉,我们称之为–类型擦除。

1.代码验证

public static void main(String[] args) {
        ArrayList<String> strList = new ArrayList<>();
        ArrayList<Integer> intList = new ArrayList<>();

        System.out.println(strList.getClass().getSimpleName());
        System.out.println(intList.getClass().getSimpleName());

        //发生 类型擦除了
        System.out.println("-------------");
    
        // 使用反射验证
        Erasure<Integer> erasure=new Erasure<>();
        Field[] declaredFields = erasure.getClass().getDeclaredFields(); 
        
        for (Field declaredField : declaredFields) {
            System.out.println(declaredField);
            //private java.lang.Object com.promsing.generics.demo7.Erasure.key
            
            System.out.println(declaredField.getName());
            //key
            
            System.out.println(declaredField.getType().getName());
            //java.lang.Object
        }
    }

2.无限制类型擦除:把T转换成Object

3.有限制类型擦除:把T转换成上限

4.擦除方法

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小张自由—>张有博

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值