【发布时间】:2013-08-16 11:12:16
【问题描述】:
在java中,int、float等都是原始类型。如果我们需要将它与泛型一起使用,则使用包装器类。 但是下面的声明在java中仍然有效,
Class<Integer> intClass=int.class
我们如何调用int.class,即使它是一个原始类型?
【问题讨论】:
在java中,int、float等都是原始类型。如果我们需要将它与泛型一起使用,则使用包装器类。 但是下面的声明在java中仍然有效,
Class<Integer> intClass=int.class
我们如何调用int.class,即使它是一个原始类型?
【问题讨论】:
原语变成对象
对于原语,在相应的包装类中有可用作名为 TYPE 的常量的 Class 对象——即 int.class 更改为 java.lang.Integer.TYPE 。对于其他类型,编译器在正在编译的类中创建一个私有成员变量来保存 Class 对象,并生成代码以使用 Class.forName() 初始化该成员。
找到了一些discussion
还有一个不错的discussion here,您的示例也包含在此链接中。
从那里说几句话:
一个类怎么可能是一个原始的?让我们再混淆一下。我们可以通过编码访问表示定义类的 Class 对象,比如:
Equation.class // returns the Equation Class object
但是,我们也可以说:
int.class
获得一个名为“int”的类对象。请注意,我们没有将 getClass() 方法发送给对象;我们使用了内置原始类型 (int) 的保留字,并使用点表示法访问了它的类“字段”。这会返回一个 Class 对象!
【讨论】:
根据规范,int.class 与 Class<Integer> 的类型相同。
来自Docs:
基本的 Java 类型(布尔、字节、字符、短、整数、长、 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 对象(或 for void) 由类的定义类加载器定义 当前实例的。
【讨论】:
Class<Integer>”是错误和误导的。 int.class的type是Class<Integer>,但它与Class<Integer>实例Integer.class是完全不同的对象,它代表原始ints的类型而不是@ 987654334@ 个对象。
类字面量是一个表达式,由类、接口、数组或原始类型或伪类型 void 的名称组成,后跟一个 `.'和令牌类。
表示为 Class 对象。
所以System.out.println(int.class); 将打印int 而System.out.println(Integer.class); 将打印class java.lang.Integer。
【讨论】: