int.class是什么意思

在java int,float等中,是原始类型。 我们需要使用包装类来使用generics。 但是仍然以下声明在java中有效,

Class intClass=int.class 

我们怎么能调用int.class即使它是一个原始类型?

原语成为对象

对于基元,在相应的包装类中有可用作名为TYPE的常量的Class对象 – 即int.class更改为java.lang.Integer.TYPE。 对于其他类型,编译器在要编​​译的类中创建一个私有成员变量来保存Class对象,并生成使用Class.forName()初始化该成员的代码。

找到了一些讨论

这里有一个很好的讨论 ,你的例子也包含在这个链接中。

从那里说几句话:

一个class怎么能成为一个原始人? 让我们把事情搞得一团糟。 我们可以通过编码访问表示已定义类的Class对象,比如说:

 Equation.class // returns the Equation Class object 

但是,我们也可以说:

 int.class 

获取名为“int”的Class对象。 注意我们没有将getClass()方法发送给对象; 我们使用保留字作为内置基元类型(int),并使用点表示法访问其类“字段”。 这会返回一个Class对象!

int.classClass类型相同,符合规范。

来自Docs :

原始Java类型(boolean,byte,char,short,int,long,float和double)以及关键字void也表示为Class对象。

来自JLS 15.8.2 :

15.8.2。 类文字

类文字是一个表达式,由类,接口,数组或基本类型的名称或伪类型void组成,后跟“。”。 和令牌类。

C.class的类型是Class ,其中C是类,接口或数组类型的名称。

p.class的类型,其中p是基本类型的名称,是Class ,其中B是在装箱转换后类型p的表达式的类型。

void.class的类型是Class

如果命名类型是类型变量或参数化类型或其元素类型是类型变量或参数化类型的数组,则是编译时错误。

如果命名类型不表示可访问的类型并且在类文本出现的位置在范围内,则这是编译时错误。

类文本计算为由当前实例的类的定义类加载器定义的命名类型(或void)的Class对象。

类文字是一个表达式,由类,接口,数组或基本类型的名称或伪类型void组成,后跟一个“。”。 和令牌类。

  1. 枚举是一种类,注释是一种接口。
  2. 每个数组也属于一个类,该类被反映为由3共享的Class对象。所有数组具有相同的元素类型和维数。
  3. 原始的Java类型(boolean,byte,char,short,int,long,float和double)和
  4. 关键字void也是

表示为Class对象。

所以System.out.println(int.class); 将打印intSystem.out.println(Integer.class); 将打印class java.lang.Integer