原始类型的用途/目的是什么?

我最近了解到JVM中的原始类型有类表示。 例如, int.classdouble.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(); 

如果没有intClass表示,上面会返回什么? 它不应该返回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层次结构是无法理解的。