iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Java中类型擦除式泛型的作用是什么
  • 128
分享到

Java中类型擦除式泛型的作用是什么

2023-06-20 20:06:49 128人浏览 薄情痞子
摘要

本篇文章给大家分享的是有关Java中类型擦除式泛型的作用是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Java选择的泛型类型叫做类型擦除式泛型。什么是类型擦除式泛型呢?就

本篇文章给大家分享的是有关Java中类型擦除式泛型的作用是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

Java选择的泛型类型叫做类型擦除式泛型。什么是类型擦除式泛型呢?就是Java语言中的泛型只存在于程序源码之中,在编译后的字节码文件里,则全部泛型都会被替换为原来的原始类型(Raw Type),并且会在相应的地方插入强制转型的代码。

因此,对于运行期间的Java程序来说ArrayList< Integer>和ArrayList< String>其实是同一个类型。这也就是Java选择的泛型类型叫做类型擦除式泛型的原因。

ArrayList<String> stringArrays =new ArrayList<>();ArrayList<Integer> intArrays =new ArrayList<>();System.out.println(stringArrays.getClass().getTypeName().equals(intArrays.getClass().getTypeName()));很显然 答案是 true,因为他们的类型都是java.util.ArrayList

一、类型擦除式泛型

Java为什么采用这种泛型呢?其实在于如果使用C#类型的泛型的话,会导致新的的Java版本无法去兼容原始的Java版本,也就会违背“二进制兼容性”原则。

所谓“二进制兼容性”,指的就是在升级java的版本时,不必重新修改原来的程序代码,既可使得程序在现在以至于未来的版本中能够正常运行。

也是因为“二进制兼容性”原则,Java在1.4.2之前的版本都没有支持过泛型,如果需要在1.5之后的版本突然引入泛型,就需要考虑让以前的程序在新版本的虚拟机中还能正常运行。

其实,Java的设计者也可以考虑学习C#一般,平行地增加一套泛型版本的新类型,以前的版本保持不变就行了。但是Java的设计人员并没有这么做,而是选择了把已有的不支持泛型的类型泛型化,不添加任何平行于已有类型的泛型版。

还是我们刚刚所讲的例子,因为Java1.5之后把所有的类型泛型化,所以ArrayList< Integer>和ArrayList< String>全都被转化为了ArrayList的子类。

将之前的代码反序列化之后,我们能够看出强制转化的类型消失了,Java代码变回了泛型出现之前的写法。

public static void main(String[] var0) {    ArrayList var1 = new ArrayList();    ArrayList var2 = new ArrayList();}

当然,元素访问时插入了从Object到String的时候,则会强制转型代码。

Java中类型擦除式泛型的作用是什么

泛型擦除之后:

HashMap var1 = new HashMap();var1.put("A", "A");System.out.println((String)var1.get("A"));HashMap var2 = new HashMap();var2.put(1, "A");System.out.println((String)var2.get(1));HashMap var3 = new HashMap();var3.put("A", 1);System.out.println(var3.get("A"));

也是因为类型擦除的问题,我们存入List的不同类型的对象都可以自然的转换成Object类型,但是取出的时候都需要强制转换,所以会出现拆箱装箱的消耗、以及可能出现的数据类型转换的错误。因此,在使用集合的时候推荐使用ArrayList< String>这种已经转换完毕的形式。

ArrayList var1 = new ArrayList();var1.add("aaaa");var1.add(100);var1.add('c');var1.add(21.5F);

二、泛型可能出现的问题

类型转换的问题

如果我们想实现一个方法,想要将不确定的List集合转化为数组,那我们该怎么做?因为泛型的类型可擦除,我们无法直接从List中取得参数化类型T,所以只能从额外的参数中传递一个数组的泛型类型进去进行转换。

//必须传递Class<T> otherType作为参数类型public static <T> T[] convert(List<T> list ,Class<T> otherType){    T[] array = (T[]) Array.newInstance(otherType,list.size());    return array;}public static void main(String[] args) {    List<String> list = new ArrayList<String>(){{        add("A");    }};     String[] result =convert(list,String.class);}

当然,也可以通过反射手段来获取泛型类型。

Class clazz = list.getClass();//getSuperclass()获得该类的父类System.out.println(clazz.getSuperclass()); //class java.util.ArrayList//getGenericSuperclass()获得带有泛型的父类//Type是 Java 编程语言中所有类型的公共高级接口。它们包括原始类型、参数化类型、数组类型、类型变量和基本类型。Type type = clazz.getGenericSuperclass();System.out.println(type); //java.util.ArrayList<java.lang.String>//ParameterizedType参数化类型,即泛型ParameterizedType p = (ParameterizedType) type;//getActualTypeArguments获取参数化类型的数组,泛型可能有多个Class c = (Class) p.getActualTypeArguments()[0];System.out.println(c); //class java.lang.StringString[] convert = convert(list, c);

泛型与重载的矛盾

public static  void method(List<String> list){     }public static  void method(List<Integer> list){}便已无法通过:'method(List<Integer>)' clashes with 'method(List<String>)'; both methods have same erasure

我们已知上面的代码是无法通过编译的,因为List中的参数被擦除了,变成了原始类型的List。

三、泛型的最佳实践

经过之前的论述,大家已经知道了Java泛型的一些基础知识,以及在使用泛型的时候可能出现的问题。如果在使用泛型的时候可以遵循一些基本的原则,就能避免一些常见的问题。

在代码中避免泛型类和原始类型的混用。比如List< String>和List不应该共同使用。这样会产生一些编译器警告和潜在的运行时异常。当需要利用jdk 5之前开发的遗留代码,而不得不这么做时,也尽可能的隔离相关的代码。

  1. 在代码中避免泛型类和原始类型的混用。比如List< String>和List不应该共同使用。这样会产生一些编译器警告和潜在的运行时异常。当需要利用JDK 5之前开发的遗留代码,而不得不这么做时,也尽可能的隔离相关的代码。

  2. 在使用带通配符的泛型类的时候,尽可能的明确通配符所代表的一组类型的概念。

  3. 泛型类最好不要同数组一块使用。你只能创建new List<?>[10]这样的数组,无法创建new List[10]这样的。这限制了数组的使用能力,而且会带来很多费解的问题。因此,当需要类似数组的功能时候,使用集合类即可。

  4. 如果编译器给出的警告信息,在其他地方很多时候可以忽略(可能是格式带来的问题),但是在泛型代码中还是尽量解决问题。

以上就是Java中类型擦除式泛型的作用是什么,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注编程网精选频道。

--结束END--

本文标题: Java中类型擦除式泛型的作用是什么

本文链接: https://www.lsjlt.com/news/299932.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java中类型擦除式泛型的作用是什么
    本篇文章给大家分享的是有关Java中类型擦除式泛型的作用是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Java选择的泛型类型叫做类型擦除式泛型。什么是类型擦除式泛型呢?就...
    99+
    2023-06-20
  • Java泛型类型擦除
    目录1. 什么是类型擦除2. 什么是原始类型3. 类型擦除带来的问题和解决方法3.1 和多态的冲突3.2 不能使用instanceof3.3 在静态类和静态方法中的问题1. 什么是类...
    99+
    2024-04-02
  • Java中怎么擦除泛型类型
    Java中怎么擦除泛型类型,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。前言Java泛型这个特性是从JDK 1.5才开始加入的,因此为了兼容之前的版本,Java泛型的实现采...
    99+
    2023-06-20
  • Java的类型擦除式泛型详解
    Java选择的泛型类型叫做类型擦除式泛型。什么是类型擦除式泛型呢?就是Java语言中的泛型只存在于程序源码之中,在编译后的字节码文件里,则全部泛型都会被替换为原来的原始类型(Raw...
    99+
    2024-04-02
  • Java泛型擦除是什么
    这篇文章主要介绍了Java泛型擦除是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java泛型擦除是什么文章都会有所收获,下面我们一起来看看吧。泛型信息只存在于代码编译阶段,但是在java的运行期(已经生成...
    99+
    2023-06-27
  • java泛型中类型擦除怎么转换
    今天小编给大家分享一下java泛型中类型擦除怎么转换的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。说明泛型值存在于编译阶段,...
    99+
    2023-06-30
  • 怎么用Java泛型实现类型擦除
    本篇内容主要讲解“怎么用Java泛型实现类型擦除”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用Java泛型实现类型擦除”吧!前言先给大家奉上一道经典的测试题。List<String&...
    99+
    2023-06-29
  • Java中泛型擦除的原理是什么
    这篇文章将为大家详细讲解有关Java中泛型擦除的原理是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。python是什么意思Python是一种跨平台的、具有解释性、编译性、互动性和面向对象...
    99+
    2023-06-14
  • Java泛型的类型擦除怎么理解
    今天小编给大家分享一下Java泛型的类型擦除怎么理解的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解...
    99+
    2024-04-02
  • java泛型中类型擦除的转换示例
    这篇文章给大家分享的是有关java泛型中类型擦除的转换示例的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。java基本数据类型有哪些Java的基本数据类型分为:1、整数类型,用来表示整数的数据类型。2、浮点类型,用...
    99+
    2023-06-14
  • Java泛型的类型擦除示例详解
    目录前言泛型的类型擦除原则是:1 擦除类定义中的类型参数1.1 无限制类型擦除1.2 有限制类型擦除2 擦除方法定义中的类型参数3 桥接方法和泛型的多态总结参考资料前言 Java泛型...
    99+
    2024-04-02
  • Java泛型中类型擦除问题怎么解决
    这篇“Java泛型中类型擦除问题怎么解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java泛型中类型擦除问题怎么解决”文...
    99+
    2023-06-30
  • Java泛型之类型擦除实例详解
    目录前言泛型是什么?泛型的定义和使用泛型类泛型方法泛型类与泛型方法的共存现象泛型接口通配符?无限定通配符<><extendsT>类型擦除类型擦除带来的局限性泛...
    99+
    2024-04-02
  • 详解java 中泛型中的类型擦除和桥方法
    在Java中,泛型的引入是为了在编译时提供强类型检查和支持泛型编程。为了实现泛型,Java编译器应用类型擦除实现:       1、  用类型参数(type parame...
    99+
    2023-05-31
    java 泛型 桥方法
  • Java 泛型考古 泛型擦除 包装类详细解析
    目录一. 什么是泛型二. 为什么要有泛型 ?示例三、泛型考古四、泛型擦除五、包装类六、装箱拆箱一. 什么是泛型 泛型(generic type)其本质是将类型参数化,也就是说所操作的...
    99+
    2024-04-02
  • 详解Java泛型中类型擦除问题的解决方法
    以前就了解过Java泛型的实现是不完整的,最近在做一些代码重构的时候遇到一些Java泛型类型擦除的问题,简单的来说,Java泛型中所指定的类型在编译时会将其去除,因此List&nbs...
    99+
    2024-04-02
  • Java语法关于泛型与类型擦除的分析
    泛型与类型擦除 泛型,JDK 1.5新特性,本质是参数化类型(Parametersized Type) 的应用,即所操作的数据类型被指定为一个参数。这种参数类型可用在: 类...
    99+
    2024-04-02
  • Java中泛型擦除的示例分析
    小编给大家分享一下Java中泛型擦除的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1.问题引出源码: public static&n...
    99+
    2023-05-31
    java
  • Java泛型擦除的问题怎么解决
    这篇文章主要介绍了Java泛型擦除的问题怎么解决,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。java基本数据类型有哪些Java的基本数据类型分为:1、整数类型,用来表示整数...
    99+
    2023-06-14
  • Java泛型的作用是什么
    这篇“Java泛型的作用是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java泛型的作用是什么”文章吧。简介泛型的作用...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作