概念
Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。
泛型的本质是参数化类型,即给类型指定一个参数,然后在使用时再指定此参数具体的值,那样这个类型就可以在使用时决定了。这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。
优点
- 在编译的时候检查类型安全;使用泛型可以在编译时期进行类型检查,从而避免在运行时期发生类型错误。泛型可以在编译时期捕获错误,从而提高了程序的稳定性和可靠性。
- 避免了源代码中的许多强制类型转换,增加可读性;使用泛型可以使代码更加可读、清晰。通过泛型,可以更好地表达代码的意图,避免了使用Object等不具有明确含义的类型。
- 提高了代码的重用性;可以在不改变代码的情况下创建多个不同类型的对象。例如,使用List可以创建不同类型的列表,而不需要为每种类型编写不同的代码。
只在编译阶段作用
如下:
List<String> list = new ArrayList<>();
list.add("1");
list.add("seven");
Class<? extends List> aClass = list.getClass();
Method add = aClass.getDeclaredMethod("add", Object.class);
add.invoke(list,new Object());
System.out.println(list);
//输出
[1, seven, java.lang.Object@511baa65]
虽然指定List泛型为String,但只在编译阶段作用,在运行阶段会执行泛型擦除操作
泛型擦除
泛型的代码只存在于编译阶段,在进入JVM之前,与泛型相关的信息会被擦除掉,称之为类型擦除。
无限制类型擦除
当在类的定义时没有进行任何限制,那么在类型擦除后将会被替换成Object,例如<T>、<?> 都会被替换成Object。
有限制类型擦除
当类定义中的参数类型存在上下限(上下界),那么在类型擦除后就会被替换成类型参数所定义的上界或者下界,
- 例如<? extend Person>会被替换成Person,而<? super Person> 则会被替换成Object。
获取泛型的参数类型
既然类型被擦除了,那么如何获取泛型的参数类型呢?可以通过反射(java.lang.reflect.Type)获取泛型
java.lang.reflect.Type是Java中所有类型的公共高级接口, 代表了Java中的所有类型. Type体系中类型的包括:数组类型(GenericArrayType)、参数化类型(ParameterizedType)、类型变量(TypeVariable)、通配符类型(WildcardType)、原始类型(Class)、基本类型(Class), 以上这些类型都实现Type接口。
public class GenericType<T> {
private T data;
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
public static void main(String[] args) {
GenericType<String> genericType = new GenericType<String>() {};
Type superclass = genericType.getClass().getGenericSuperclass();
//getActualTypeArguments 返回确切的泛型参数, 如Map<String, Integer>返回[String, Integer]
Type type = ((ParameterizedType) superclass).getActualTypeArguments()[0];
System.out.println(type);//class java.lang.String
}
}
关于作者
来自一线程序员Seven的探索与实践,持续学习迭代中~
本文已收录于我的个人博客:https://www.seven97.top
公众号:seven97,欢迎关注~
1.本站内容仅供参考,不作为任何法律依据。用户在使用本站内容时,应自行判断其真实性、准确性和完整性,并承担相应风险。
2.本站部分内容来源于互联网,仅用于交流学习研究知识,若侵犯了您的合法权益,请及时邮件或站内私信与本站联系,我们将尽快予以处理。
3.本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
4.根据《计算机软件保护条例》第十七条规定“为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。”您需知晓本站所有内容资源均来源于网络,仅供用户交流学习与研究使用,版权归属原版权方所有,版权争议与本站无关,用户本人下载后不能用作商业或非法用途,需在24个小时之内从您的电脑中彻底删除上述内容,否则后果均由用户承担责任;如果您访问和下载此文件,表示您同意只将此文件用于参考、学习而非其他用途,否则一切后果请您自行承担,如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
5.本站是非经营性个人站点,所有软件信息均来自网络,所有资源仅供学习参考研究目的,并不贩卖软件,不存在任何商业目的及用途
暂无评论内容