在java int,float等中,是原始类型。我们需要使用包装类来使用泛型。 但是仍然以下声明在java中起作用,
Class<Integer> intClass=int.class
即使它是原始类型,我们如何调用int.class
?
答案 0 :(得分:6)
原语成为对象
对于基元,在相应的包装类中有可用作名为TYPE的常量的Class对象 - 即int.class更改为java.lang.Integer.TYPE。对于其他类型,编译器在要编译的类中创建一个私有成员变量来保存Class对象,并使用Class.forName()生成用于初始化该成员的代码。
找到了一些discussion
一个不错的discussion here和你的例子也包含在这个链接中。
从那里说几句话:
一个Class怎么能成为一个原始的?让我们把事情搞得一团糟。我们可以通过编码访问表示已定义类的Class对象,比如:
Equation.class // returns the Equation Class object
但是,我们也可以说:
int.class
获取名为“int”的Class对象。注意我们没有将getClass()方法发送给对象;我们使用保留字作为内置基元类型(int),并使用点表示法访问其类“字段”。这会返回一个Class对象!
答案 1 :(得分:4)
int.class
与Class<Integer>
的类型相同,符合规范。
来自Docs:
原始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.class的类型,其中p是基本类型的名称, 是
Class<B>
,其中B是p后面的类型表达式 拳击转换。void.class的类型是
Class<Void>
。如果命名类型是类型变量,则是编译时错误 或参数化类型或元素类型为a的数组 类型变量或参数化类型。
如果命名类型不表示类型,则为编译时错误 这是可访问的,并且在范围内 class literal出现。
类文字计算命名类型的Class对象(或 for void)由类的定义类加载器定义 当前实例。
答案 2 :(得分:2)
类文字是一个表达式,由类,接口,数组或基本类型的名称或伪类型void组成,后跟一个“。”和令牌类。
表示为Class对象。
因此System.out.println(int.class);
将打印int
,而System.out.println(Integer.class);
将打印class java.lang.Integer
。