首页 > 解决方案 > 班级与班级在爪哇

问题描述

这两行代码有区别吗?或者第一行只是一种速记方式还是写第二行?

Class cls1 = Person.class;
Class<Person> cls2 = Person.class;

标签: javagenerics

解决方案


两者之间的差异仅在编译时显着。

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

当与反射一起使用或以其他方式检查时,两者没有区别,因为实例相同并且泛型类型被擦除。


推荐阅读