为什么原始类型具有"类"以及它如何用于使用?

oll*_*llo 3 java types

谈到Java(7),你可以得到一个像这样的原始类的类:

Class classOfInt = int.class
Run Code Online (Sandbox Code Playgroud)

对于每一个,您将获得一个名为基本类型的"类":

int.class    --> int
byte.class   --> byte
double.class --> double
...
Run Code Online (Sandbox Code Playgroud)

但是,您无法创建这些实例:

char.class.newInstance(); // throws 'InstantiationException'
Run Code Online (Sandbox Code Playgroud)

看来,他们班没有被映射到相应的包装类(Integer,Byte,等).

那么为什么他们有"课程",他们如何使用以及如何实施?

Pet*_*rey 6

它们用于反射.

Method round = Math.class.getMethod("round", double.class);
System.out.println(Arrays.toString(round.getParameterTypes()));
System.out.println(round.getReturnType() == long.class);

Method exit = System.class.getMethod("exit", int.class);
System.out.println(Arrays.toString(exit.getParameterTypes()));
System.out.println(exit.getReturnType() == void.class);
Run Code Online (Sandbox Code Playgroud)

版画

[double]
true
[int]
true
Run Code Online (Sandbox Code Playgroud)

他们是如何实施的?

它们内置于JVM,没有用于定义它们的类文件.

  • 所以`java.lang.Class`应该更准确地称为`java.lang.Type`. (4认同)
  • 是的,我知道`java.lang.reflect.Type`.它更通用,更无用;-)但是`Class`表示类,接口,枚举类型,注释类型和原始类型的事实已经导致*一些*混乱.其中至少有3个存在于Java 1.0中. (4认同)
  • 我也会将数组类型添加到列表中,并将`void.class`添加到上面. (4认同)
  • @SamuelEdwinWard:仅在接口是类的意义上(因为在字节码级别上,注释类型是具有特殊标志的接口类型).所以"是的,不是".它们*存储在`.class`文件中,但枚举类型(实际上*是*伪装的类)也是如此.但仍然:`void.class`,数组类型和基本类型是*not*classes(至少就它们*不存储在`.class`文件中而言). (3认同)
  • @JoachimSauer,我从来没有注意到注释是接口而不是之前的类.似乎是一个奇怪的选择.谢谢你让我直截了当. (2认同)
  • @SamuelEdwinWard您可以在界面中扩展注释或使用类实现它.我没有找到这样的用途,但它合法. (2认同)
  • @SamuelEdwinWard:实际上它是有道理的:注释只包含声明而没有实际代码,就像接口一样.并且注释在运行时由JVM动态"实现"(可能通过类似于代理的机制). (2认同)