【手撕spring源码】泛型复习

泛型类

  • 泛型的参数不支持基本类型
  • 泛型相关的信息不会进入到运行时阶段
    在编译过程中,正确检验泛型结构后,JVM会将泛型的相关信息擦除,并在对象进入和离开的边界处添加类型检查和类型转换的方法,即不会进入运行时阶段,例如
        GenericClasExample<String> stringExample = new GenericClasExample<String>("abc");
        GenericClasExample<Integer> integerExample = new GenericClasExample<Integer>(123);
        System.out.println(stringExample.getClass());
        System.out.println(integerExample.getClass());

输出为

class demo.genreric.GenericClasExample
class demo.genreric.GenericClasExample

两个类型一致,意味着泛型的类型约束只在编译的时候有效,对比编译前和编译后的结果。
下面开始验证,使用javac编译文件
在这里插入图片描述
可以看到输出了两个class文件,idea支持直接打开,打开后发现以及没有了泛型的相关信息。

package demo.generic;

public class GenericDemo {
    public GenericDemo() {
    }

    public static void main(String[] var0) {
        GenericClasExample var1 = new GenericClasExample("abc");
        GenericClasExample var2 = new GenericClasExample(123);
        System.out.println(var1.getClass());
        System.out.println(var2.getClass());
    }
}

能否在泛型中使用具备继承关系的类?

能,有三种方法

  • 使用通配符,但是会使得泛型的类型检查失去意义
    public  static void handleMember(GenericClasExample<?> integerGenericClasExample){
        Integer result = 111 + (Integer) integerGenericClasExample.getMemeber();
        System.out.println("result is" + result);
    }

这种做法虽然让泛型满足拥有继承关系的数据类型,但是通配符将不具备继承关系的数据类型也支持了,和引入泛型的目的是相悖的,容易产生类型转换异常。

  • 给泛型加入上边界?extends E ,给通配符引入继承的上边界限制,该语义表示泛型的实参的父类必须是E,将错误在暴露在编译期间,这里在设置上边界时注意不应过于上层。
  • 给泛型加入下边界?super E ,该语义表示该泛型的实参的子类必须是E

泛型接口

泛型接口的实现类的泛型形参必须与泛型接口的泛型形参一致。
在这里插入图片描述

泛型方法

既能用在泛型类、泛型接口里,也能用在普通类或者接口里

    public static <E> void printArray(E[] inputArray){
        for (E element:inputArray){
            System.out.println("%s",element);
            System.out.println(" ");
        }
        System.out.println();
    }

泛型方法与泛型类中的方法的区别是:泛型方法需要泛型标识符,而泛型类中的方法不带泛型标识符,属于普通方法。
使用泛型方法:

        Integer[] integers ={1,2,3,4,5,6};
        Double[] doubles ={1.1,2.2,3.3,4.4,5.5,6.6};
        Character[] characters = {'A','B','C'};
        stringExample.printArray(integers);
        stringExample.printArray(doubles);
        stringExample.printArray(characters);

泛型方法中的E的标识符并不受制于T,而泛型类中的方法的返回值和参数类型必须为泛型类传入的实参类型。
注意:泛型方法中的泛型标识符能和泛型类一样,但是在使用时可以传入和泛型类型不同的实参,即独立于泛型类实参

泛型字母的含义

  • E-Element:在集合中使用,因为集合中存放的是元素
  • T-Type:Java类
  • K-Key:键
  • V-Value:值
  • N-Number:数值类型,包括double,long,integer
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值