java - 班级与班级在爪哇
问题描述
这两行代码有区别吗?或者第一行只是一种速记方式还是写第二行?
Class cls1 = Person.class;
Class<Person> cls2 = Person.class;
解决方案
两者之间的差异仅在编译时显着。
Class<Person>
允许类型安全和静态类型检查。例如,编译器完全理解以下代码并减少了不必要的类型转换。此外,它是类型安全的:
Class<Person> personClass = Person.class;
Person person = personClass.newInstance(); //Great! Return type is Person
但是,使用原始Class
类型的同一版本并没有提供上述代码的类型安全优势:
Class personClass2 = Person.class;
Person person2 = personClass2.newInstance(); //error
编译器抱怨最后一条语句:
类型不匹配:无法从 Object 转换为 Person
尽管它实际上是同一个Class
实例,但泛型版本允许静态类型检查,这提供了安全性并避免了不必要的类型转换。
然而,在运行时,两者基本上是等价的。
System.out.println(personClass == personClass2); //true
System.out.println(personClass == person.getClass()); //true
当与反射一起使用或以其他方式检查时,两者没有区别,因为实例相同并且泛型类型被擦除。
推荐阅读
- c# - 解析 Azure 搜索查询筛选器
- javascript - 如何通过单击从循环的 js 对象中获取的导航栏项来使用 useState 来切换下拉菜单
- java - 二进制 XML 文件第 17 行:膨胀类 com.camerakit.CameraKitView 时出错
- sql - BigQuery:为表中的缺失列填充空值
- docker - Gunicorn Docker 容器仅监听 `0.0.0.0`
- knex.js - Knex 无法运行迁移,因为缺少必需的配置选项“client”
- microsoft-graph-api - 如何使用 Graph API 打印反馈和积分?
- google-apps-script - 使用同一谷歌表格中的多张表格中的信息自动计算表格
- rust - 如何从头开始在 linux 中创建一个临时的 UInputDevice?
- rcpp - 我可以手动编辑 RcppExport.R 吗?