泛型理解、好处、类型擦除、泛型中的限定通配符和非限定通配符

什么是泛型

是JDK5引入的一个新特性,泛型的本质就是类型参数化,比如我们创建一个ArrayList集合存数据,就是ArrayList<String> list=new ArrayList<String>();String的位置就是参数的位置,使用泛型把类型参数化,等到我们在使用的时候再给他一个具体的值,让他存String类型的数据。泛型也是一种语法糖,基本原理就是类型擦除。

语法糖(Syntactic sugar),也译为糖衣语法,指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。通常来说使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会。

泛型的好处

  1. 避免了许多强制类型转换,保证了类型安全

泛型的主要目的就是提高java程序的类型安全,比如我们是用数组列表的时候,如果没有泛型,每次取出数据都需要强制类型转换,因为不知道存进去的是什么类型,而且在编译的时候编译器不知道类型转换是否正常,运行时才知道,非常不安全。而有了泛型之后,编译时期就可以检查出来因为类型不符而导致的错误。

publicstaticvoidmain(String[] args) {
    //不使用泛型
    ArrayListlist=newArrayList();
    //使用泛型,就不会允许放进去不同类型的数据
    //ArrayList<String> list=new ArrayList();
    list.add("你好");
    list.add(666);
    //运行后会出现 强制类型转换异常 ClassCastException
    Stringstring=(String) list.get(0);
    Stringnum=(String) list.get(1);
}

2、泛型的所有工作都在编译器中完成,所以只存在于编译阶段,不存在于运行阶段,编译器生成的代码跟不使用泛型的时候几乎是一模一样的,只不过泛型能确保类型安全,JVM进行类编译的时候会进行检查,如果一个集合被定义为String类型,那么它向集合里存取数据的时候就会对数据判断,避免存入或取出错误的数据。

ArrayList<String>a=newArrayList<String>();
ArrayList<Integer>b=newArrayList<Integer>();
Classc1=a.getClass();//返回Class类型的对象
Classc2=b.getClass();
System.out.println(c1==c2);//输出结果是true,发现他们的Class类型是一致的,都是
                           //ArrayList.class

泛型中的限定通配符和非限定通配符


限定通配符对类型进行了限制,有两种限定通配符,一种是<? extends T>它通过确保类型必须是T的子类来设定类型的上限;另一种是<? super T>它通过确保类型必须是T的父类来设定类型的下界。泛型类型必须用限定内的类型来进行初始化,否则会导致编译错误。

非限定通配符可以用任意类型代替:比如List<?>的意思就是这个集合可以存任何类型。

类型擦除:


简单来说就是使用泛型的时候加上类型参数,编译器在编译的时候会去掉类型参数。泛型实现的内部原理就是类型擦除,比如说我们在list集合中存一个Integer类型的数据(list.add(10)),java编译的时候编译器会擦除尖括号,将Integer类型定义为Object类型,我们往外拿数据的时候(list.get(0)),编译器还会做一个类型转换。如果接受的类型是int的话,还会做一个自动拆箱的操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 泛型限定通配符是指在泛型类型使用了extends或super关键字来限制泛型类型的范围,使其只能接受某个特定类型或其子类型或父类型作为参数。例如:List<? extends Number>表示只能接受Number及其子类作为参数。 限定通配符是指在泛型类型使用了通配符“?”来表示可以接受任何类型作为参数,但是在使用时无法获取泛型类型的具体信息。例如:List<?>表示可以接受任何类型的List作为参数,但是无法获取其元素的具体类型信息。 ### 回答2: 泛型Java语言一种常强大的特性,它能够使Java代码更加通用和安全。 在泛型通配符是一种常重要的语法,它能够限制泛型类型范围,从而使Java程序更加类型安全。通配符分为限定通配符限定通配符两种类型。 首先,限定通配符就是指没有任何限制的通配符,使用“?”符号来表示。在Java,我们可以将一个泛型对象赋值给一个限定通配符对象,这样就可以保证代码的通用性。 举个例子,假设我们有一个ArrayList集合,集合存储的是Animal类的对象。我们可以将这个ArrayList赋值给一个限定通配符的对象,这样就可以将集合的元素通用化,可以同时适用于Cat类和Dog类。 但是,如果我们想要对通配符进行类型限制,就需要使用限定通配符了。 限定通配符可以通过使用extends或者super关键字来实现。其,extends用于限制泛型类型的上界,super用于限制泛型类型的下界。 需要注意的是,extends和super关键字只能使用在通配符,而不能直接用在泛型。 举个例子,假如我们有一个Animal类,以及它的两个子类Cat和Dog。我们现在想要一个可以存储Animal及其子类对象的集合,但是不想让集合存储Bird及其子类对象。这个时候,我们就可以使用限定通配符来约束集合元素的类型范围。例如: ArrayList<? extends Animal> animals = new ArrayList<Cat>(); //这是合法的 ArrayList<? extends Animal> animals2 = new ArrayList<Bird>(); //这是不合法的 这样就能够保证animals集合只存储Animal及其子类对象,而不会存储Bird及其子类对象。 总之,限定通配符限定通配符泛型的两个重要概念。通过使用这些通配符,我们可以限制泛型类型的范围,使Java程序更加类型安全。 ### 回答3: 泛型通配符指的是在定义泛型类或方法时使用的一种特殊符号,它可以替代任何类型的实参,从而实现更加灵活的泛型代码编写。 其,有两种常见的通配符,分别是限定通配符限定通配符限定通配符用“?”表示,它可以匹配任何类型的实参。例如,定义一个泛型方法时可以使用“?”作为参数类型,这样就能够在方法处理任何类型的数据。 限定通配符则使用泛型类型来表示,它可以限制通配符只能匹配某些具体的类型或其子类型。例如,定义泛型方法时可以使用“? extends Number”来限定参数类型范围,这样方法只接受Number及其子类类型的实参。 在使用通配符时,需要注意通配符只能作为参数、返回值或泛型类型变量的上界使用,不能用作实例化泛型类型类型参数的下界。此外,通配符不能使用任何操作符,而只能使用Object类提供的通用方法。 综上所述,泛型限定通配符限定通配符是为了提高泛型程序的灵活性和适用性而设计的。通过选择适当的通配符来限制参数类型范围,可以有效避免类型转换异常和其他类型相关的问题,使泛型代码更加健壮和可靠。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值