在java中,int、float等都是基元类型。包装类是在我们需要将其与泛型一起使用的情况下使用的。但是以下声明仍然适用于java、
Class<Integer> intClass=int.class
即使int.class
是一个基元类型,我们怎么能调用它呢?
成为对象的基元
对于基元,在相应的包装类中有可用的Class对象作为名为TYPE的常量,即int.Class被更改为java.lang.Integer.TYPE。对于其他类型,编译器在正在编译的类中创建一个私有成员变量来保存Class对象,并使用Class.forName()生成代码来初始化该成员。
发现一些讨论
这里有一个很好的讨论,你的例子也包含在这个链接中。
几句话:
类怎么可能是基元?让我们再把事情弄糊涂一点。我们可以通过编码来访问表示已定义类的Class对象,比如:
Equation.class // returns the Equation Class object
但是,我们也可以说:
int.class
获取名称为"int"的Class对象。请注意,我们还没有将getClass()方法发送到对象;我们使用了内置基元类型(int)的保留字,并使用点表示法访问了它的类"field"。这将返回一个class对象!
int.class
根据规范与Class<Integer>
类型相同。
来自文档:
原始Java类型(boolean、byte、char、short、int、long、,float和double),以及关键字void也表示为Class对象。
来自JLS 15.8.2:
15.8.2.类文字
类文字是由类的名称组成的表达式,接口、数组或基元类型,或伪类型void,后跟由一个"。"以及令牌类。
C.class的类型,其中C是类、接口或数组类型为
Class<C>
。p类的类型,其中p是基元类型的名称,是
Class<B>
,其中B是在装箱转换void.class的类型为
Class<Void>
。如果命名类型是类型变量,则是编译时错误或参数化类型或元素类型为类型变量或参数化类型。
如果命名类型不表示类型,则是编译时错误在类文字出现。
类文字的计算结果为命名类型的class对象(或用于void),由类的定义类加载器定义当前实例的。
类文字是一个表达式,由类、接口、数组或基元类型的名称或伪类型void组成,后跟"."以及令牌类。
- 枚举是一种类,注释是一种接口
- 每个数组也属于一个类,该类反映为3共享的class对象。具有相同元素类型和维数的所有数组
- 原始Java类型(boolean、byte、char、short、int、long、float和double),以及
- 关键字void也是
表示为Class对象。
因此System.out.println(int.class);
将打印int
,而System.out.println(Integer.class);
将打印class java.lang.Integer
。