原始类型的用途/目的是什么?
我最近了解到JVM中的原始类型有类表示。 例如, int.class
, double.class
,甚至是void.class
。
我不明白为什么会有这些。 它们似乎没有任何function性作用。 使用reflection,我搜索了类,它们没有构造函数,没有方法,也没有字段。 出于所有意图和目的,它们似乎空洞无用。 原始类型变量甚至不是它们各自类的实例,如下面的返回false所示:
int a = 3; int.class.isInstance(a);
那他们为什么存在呢? 他们必须为某些目的服务,可能是编译器或其他东西,但不管它是什么都完全超出我的意义。 在Integer API中甚至有一个对int.class
的显式引用(对于每个基本类型及其相应的包装器对象也是如此)。 在JLS中,我无法找到任何关于它们存在的参考,更不用说它们的用途了。
我不明白为什么会有这些。
考虑以下:
public int foo() { return 0; } ... Method method = someClass.getDeclaredMethod("foo"); Class> clazz = method.getReturnType();
如果没有int
的Class
表示,上面会返回什么? 它不应该返回Integer.class
因为它们不是同一个东西。 (想象一下,尝试区分重载的方法,一个使用int
,一个使用Integer
参数。)
我之前使用过这些类,通过reflection调用它们时为参数提供默认值。 根据参数类型,我对任何引用类型使用null
,并为每个基本类型使用一些(明显的盒装)原始值。
这是一个廉价的解决方案,结果很糟糕。
在1.5之前,Java类型可以归类为
java type primitive type reference type class type (including interface) array type
理想情况下,javareflection应该提供镜像这5种类型的5个概念。 但他们使用单个Class
来表示它们,包括原始类型和数组类型。 所以一个Class
并不一定意味着一个class级。
那还是可以管理的。 但是在1.5之后,Java类型变得更加复杂,因此引入了新的Type
。 不幸的是,他们没有直接反映语言规范的新的干净的层次结构,而是决定将Class
作为Type
的子Type
; 不仅旧的混乱被带入,它产生了一些新的混乱,整个Type
层次结构是无法理解的。