【Java核心知识】泛型和类型擦除 心已赠人 2024-03-09 00:43 57阅读 0赞 #### 文章目录 #### * 泛型 * * 什么是泛型 * 类型限定 * 类型擦除 * 如何在运行时判断泛型具体类型 * 参考链接 ## 泛型 ## ### 什么是泛型 ### Java中的`泛型`是通过定义模板参数来处理一类操作,这类操作`并不关心具体传入的参数类型`。比如对于`add()`方法来说,我们可以使两个`int`相加,也可以使两个`long`相加,如果不使用泛型,因为函数签名是通过参数类型区分的,那么就会造成需要写两个方法的问题. 但这两个方法内部的逻辑是一致的,只是传入参数不相同,况且方法内部也并不关心你传入的参数类型。 针对这种情况,我们可以使用`泛型`解决,泛型并不会限定你传入的参数类型,它只关心方法`内部的逻辑操作`。 常见的`集合类`都使用了`泛型`。 ### 类型限定 ### 既然泛型类可以传入各种各样的类型,那么使用上会不会出问题呢?比如一个集合既放入了`Integer`,又放入了`String`。 答案是`不会的`,我们在创建泛型类时,一般都会提前传入泛型的类型进行类型限定,比如 `Array<Integer> list = new ArrayList<>();`,表明list只能存放`Integer`类型的对象,而不能存放`String`类型的变量,这是由于编译器在编译代码时通过类型限定对代码进行了检查,从而避免传入不一致的类型; ### 类型擦除 ### 上面我们讲到是在编译时进行了类型检查,其实Java的泛型并不是真正的泛型,编译完成后会进行类型擦除,也就是说`ArrayList`这个类并不知道自己存放的类型是什么,内部统一用基类`Object`表示,这就是`类型擦除`。 如果正常写代码,类型擦除对我们并没有什么影响,可如果想要通过反射获取泛型属性的具体类型是做不到的。因为反射时我们一般先拿到对应类的`Class对象`,然后利用反射获取`Field`,但由于类型擦除的存在,泛型属性在`Class`对象内部都是基类`Object`,并不是具体的类型。 下面是一个示例,`count`是一个泛型属性,如果想要通过反射获取`count`运行时真正的类型,是做不到的,`type`永远是一个`java.lang.Object`。 public class ValJson { static class Count<T> { public T count; public void setCount(T count) { this.count = count; } } public static void main(String[] args) throws NoSuchFieldException { Count<Integer> count = new Count<>(); count.setCount(2); // 由于类型擦除,type 的类型为 java.lang.Object Type type = count.getClass().getField("count").getType(); System.out.println(count); } } ### 如何在运行时判断泛型具体类型 ### 只能在方法内部通过`isinstance(a, String.class)`逐一判断类型实现,这样会有很多种`if语句`。 ### 参考链接 ### [Java泛型类型擦除以及类型擦除带来的问题][Java] [Java]: https://www.cnblogs.com/wuqinglong/p/9456193.html
相关 Java泛型和类型擦除问题分析 在Java编程中,泛型和类型擦除是两个重要概念。下面将对这两个问题进行详细分析。 1. **泛型** - **定义**:泛型是在类或接口声明的类型参数,它可以被任何类型的实例 客官°小女子只卖身不卖艺/ 2024年09月11日 06:39/ 0 赞/ 19 阅读
相关 泛型(Generic) 类型擦除 什么是类型擦除 泛型是 Java 1.5 版本才引进的概念,在这之前是没有泛型的概念的,但是泛型代码能够很好地和之前版本的代码很好地兼容。这是因为,泛型信息只存在于代码编 曾经终败给现在/ 2024年03月22日 17:09/ 0 赞/ 61 阅读
相关 【Java核心知识】泛型和类型擦除 文章目录 泛型 什么是泛型 类型限定 类型擦除 如何在运行时判断泛型具体类型 参考链接 泛型 心已赠人/ 2024年03月09日 00:43/ 0 赞/ 58 阅读
相关 java泛型和类型擦除 java泛型和类型擦除 泛型的本质是参数化类型,这种参数类型可以用在类、接口和方法的创建中。泛型是在JAVA 1.5版本中才引入的,它能和以前的版本兼容的原因是泛型信息只存 刺骨的言语ヽ痛彻心扉/ 2022年12月03日 12:51/ 0 赞/ 188 阅读
相关 Java泛型-类型擦除 一、概述 Java泛型在使用过程有诸多的问题,如不存在List<String>.class, List<Integer>不能赋值给List<Number>(不 缺乏、安全感/ 2022年08月18日 03:14/ 0 赞/ 105 阅读
相关 Java泛型-类型擦除 Java泛型-类型擦除 一、概述 Java泛型在使用过程有诸多的问题,如不存在List.class, List不能赋值给List(不可协变),奇怪的ClassCastE 灰太狼/ 2022年07月16日 01:07/ 0 赞/ 292 阅读
相关 Java泛型:类型擦除 转载自:http://findingsea.github.io/2015/10/09/java-generic-type-erasure/ 前情回顾 [Java泛型:泛 深藏阁楼爱情的钟/ 2022年06月10日 13:46/ 0 赞/ 223 阅读
相关 Java 泛型类型擦除 一、泛型的表示形式 1)<T>或者<E,V>:尖括号 `<>` 中的 T、K、V 被称作是类型参数,另外,还可以使用E、S也可做类型参数、 2)通配符<?>:通配符是为 深藏阁楼爱情的钟/ 2022年05月05日 14:56/ 0 赞/ 262 阅读
相关 Java泛型之类型擦除 类型擦除详解: [来自CSDN的一篇我认为最好的讲解类型擦除的文章][CSDN]. 个人补充: 泛型擦除是指Java 编译后的字节码中已经没有泛型的任何信 向右看齐/ 2022年01月28日 04:49/ 0 赞/ 238 阅读
还没有评论,来说两句吧...