13

在java中,int、float等都是原始类型。如果我们需要将它与泛型一起使用,则使用包装器类。但是下面的声明在java中仍然有效,

 Class<Integer> intClass=int.class

int.class即使它是原始类型,我们如何调用?

4

3 回答 3

6

原语变成对象

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

找到了一些讨论

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

从那里几句话:

一个类怎么可能是一个原始的?让我们再混淆一下。我们可以通过编码访问表示已定义类的 Class 对象,例如:

Equation.class // returns the Equation Class object

但是,我们也可以说:

int.class

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

于 2013-08-16T11:16:48.080 回答
4

int.classClass<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.class 的类型,其中 p 是原始类型的名称,是Class<B>,其中 B 是装箱转换后的 p 类型表达式的类型。

void.class 的类型是Class<Void>

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

如果命名类型不表示可访问且在类文字出现点的范围内的类型,则这是一个编译时错误。

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

于 2013-08-16T11:24:51.347 回答
2

类文字是由类、接口、数组或原始类型或伪类型 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

于 2013-08-16T11:27:49.293 回答