java泛型和类型擦除 刺骨的言语ヽ痛彻心扉 2022-12-03 12:51 187阅读 0赞 java泛型和类型擦除 泛型的本质是参数化类型,这种参数类型可以用在类、接口和方法的创建中。泛型是在JAVA 1.5版本中才引入的,它能和以前的版本兼容的原因是泛型信息只存在于代码编译阶段,在进入 JVM 之前,与泛型相关的信息会被擦除掉,即类型擦除。 根据使用情况可以分为以下三种: 泛型类 泛型方法 泛型接口 下面是一个常用的泛型类: // 一个泛型类,可以根据需要包装不同结果的返回值 public class Result<T> { private boolean success; private String message; private T data; // 一个泛型方法 // 返回值类型定义前的<T>是必须的,用来声明一个类型持有者名称,然后就可以把T当作一个类型代表来声明成员、参数和返回值类型。 public static <T> Result<T> success(T data) { Result<T> r = new Result<>(); r.success = true; r.data = data; return r; } public static <T> Result<T> error(String message) { Result<T> r = new Result<>(); r.message = message; return r; } // getter & setter } 为什么要用T而不是其它字母?事实上是可以任意字符串(如Result< something >),但是为了显得专业,一般约定几个大写字母在不同场景使用。 T 最常用,一般代指任意类,不知道用啥就用它 E 代表Element,一般用在集合的泛型场景 K 代表Key,一般和Value一起出现在键值对场景(如Entry) V 代表Value,一般和Key一起出现在键值对场景(如Entry) 还有些不太常见的如S,U… 类型擦除 在Java SE 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是一个安全隐患。泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,以提高代码的重用率。 import java.lang.reflect.Field; import java.util.Date; public class Main { public static void main(String[] args) throws NoSuchFieldException { Result<Date> r1 = Result.success(new Date()); Result<Number> r2 = Result.success(2.333); dataType(r1); dataType(r2); } private static void dataType(Result<?> result) throws NoSuchFieldException { Field field = result.getClass().getDeclaredField("data"); System.out.println(field.getType().toString()); } } /* 输出: class java.lang.Object class java.lang.Object */ 通过反射我们在运行时得到了data的类型,发现都是Object,证明代码编译后所谓泛型都没了,这就是泛型擦除。 通过反射绕过泛型限制 import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Date; public class Main { public static void main(String[] args) throws Exception { ArrayList<Integer> list = new ArrayList<Integer>(); //正规途径 list.add(1); //反射大法 Method m = list.getClass().getMethod("add", Object.class); m.invoke(list, 2); m.invoke(list, 3.21); m.invoke(list, "对不起,我是字符串"); m.invoke(list, new Date()); for (Object x : list) { System.out.println(x.getClass().getName() + ":\t" + x); } } } /* 输出: java.lang.Integer: 1 java.lang.Integer: 2 java.lang.Double: 3.21 java.lang.String: 对不起,我是字符串 java.util.Date: Sun Jul 28 23:49:34 CST 2019 */
相关 Java泛型和类型擦除问题分析 在Java编程中,泛型和类型擦除是两个重要概念。下面将对这两个问题进行详细分析。 1. **泛型** - **定义**:泛型是在类或接口声明的类型参数,它可以被任何类型的实例 客官°小女子只卖身不卖艺/ 2024年09月11日 06:39/ 0 赞/ 18 阅读
相关 泛型(Generic) 类型擦除 什么是类型擦除 泛型是 Java 1.5 版本才引进的概念,在这之前是没有泛型的概念的,但是泛型代码能够很好地和之前版本的代码很好地兼容。这是因为,泛型信息只存在于代码编 曾经终败给现在/ 2024年03月22日 17:09/ 0 赞/ 60 阅读
相关 【Java核心知识】泛型和类型擦除 文章目录 泛型 什么是泛型 类型限定 类型擦除 如何在运行时判断泛型具体类型 参考链接 泛型 心已赠人/ 2024年03月09日 00:43/ 0 赞/ 56 阅读
相关 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 阅读
还没有评论,来说两句吧...