热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

java泛型与泛型擦除

1:概念泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数,在用到的时候再指定为具体的类型。与其他语言不同,java的泛型被称为伪泛型。它只在程序的源码中存在,在编译后的字节码文件中,泛

1:概念

泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数,在用到的时候再指定为具体的类型。

与其他语言不同,java的泛型被称为伪泛型。它只在程序的源码中存在,在编译后的字节码文件中,泛型被转化

成了原始类型(Raw Type)。因此对于运行期的Java语言来说,ArrayList与ArrayList一样,

都是ArrayList类。Java语言中的这种泛型实现方法称为类型擦除。

2:泛型类与泛型方法

定义 一个泛型类只需要在类的类名后面加上<>,再在里面加上类型参数即可:

  //泛型类Box
public class Box {
private T t;
public void add(T t) {
this.t = t;
}
public T get() {
return t;
}
}
定义一个类型方法:
   //泛型方法printArray
public static void printArray( E[] inputArray ){
// 输出数组元素
for ( E element : inputArray ){
System.out.printf( "%s ", element );
}
System.out.println();
}

3:类型擦除

由于java的类型被称为伪类型,在编译之后会将泛型转化为原始类型

ArrayList arrayList1=new ArrayList();  
arrayList1.add("abc");
ArrayList arrayList2=new ArrayList();
arrayList2.add(123);
System.out.println(arrayList1.getClass()==arrayList2.getClass()); //均为ArrayList类型,输出true


当然,我们也可以通过反射为ArrayList添加不同的类型:

ArrayList arrayList=new ArrayList();
arrayList.getClass().getMethod("add", Object.class).invoke(arrayList, "abc");
System.out.println(arrayList.get(0));//输出abc

4:类型转换

在调用泛型方法的时候,可以指定泛型,也可以不指定泛型。

在不指定泛型的情况下,泛型变量的类型为 该方法中的几种类型的同一个父类的最小级,直到Object。

在指定泛型的时候,该方法中的几种类型必须是该泛型实例类型或者其子类。

     //一个简单的泛型方法  
public static T add(T x,T y){
return y;
}
public static void main(String[] args) {
/**不指定泛型的时候*/
int i=Test2.add(1, 2); //两个参数都是Integer,返回为Integer类型
Number f=Test2.add(1, 1.2);//一个Integer类型,一个double类型,返回为同一父类的最小级:Number类型
Object o=Test2.add(1, "asd");//一个Integer类型,一个String类型,返回为同一父类的最小级:Object 类型

/**指定泛型的时候*/
int a=Test2.add(1, 2);//指定了Integer,所以只能为Integer类型或者其子类
int b=Test2.add(1, 2.2);//编译错误,指定了Integer,不能为Float
Number c=Test2.add(1, 2.2); //指定为Number,所以可以为Integer和Float
}
5:类型检查

为了避免某些错误,java在编译之前会对类型进行检查。对于ArrayList list=new ArrayList(); 

new ArrayList()会在内存中开辟一个存储空间,可以存储任何的类型对象。而真正涉及类型检查的是它的引用list。所以运行下面代码会有如下结果:

ArrayList list1 = new ArrayList();//编译通过,但是会有警告
list1.add("abc");//编译通过,因为list1引用申明时没有指定类型
System.out.println(list1.get(0));//输出abc

ArrayList list2 = new ArrayList();//编译通过,但是会有警告
list2.add("abc");//编译错误,list2只能添加int类型
ArrayList list3 = new ArrayList<>();//编译通过,没有警告








推荐阅读
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Android JSON基础,音视频开发进阶指南目录
    Array里面的对象数据是有序的,json字符串最外层是方括号的,方括号:[]解析jsonArray代码try{json字符串最外层是 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • C语言注释工具及快捷键,删除C语言注释工具的实现思路
    本文介绍了C语言中注释的两种方式以及注释的作用,提供了删除C语言注释的工具实现思路,并分享了C语言中注释的快捷键操作方法。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
author-avatar
nup1764819
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有