Java 基元类型类的用途是什么?
我最近了解到JVM中有一些基本类型的表示。例如,Java 基元类型类的用途是什么?,java,class,primitive,Java,Class,Primitive,我最近了解到JVM中有一些基本类型的表示。例如,int.class,double.class,甚至是void.class 我不明白的是为什么会有这些。它们似乎不起任何作用。使用反射,我搜索了所有类,它们没有构造函数,没有方法,也没有字段。无论出于何种目的,它们都显得空洞无用。基元类型变量甚至不是其各自类的实例,如下返回false所示: int a = 3; int.class.isInstance(a); 那么,它们为什么存在呢?它们必须有一定的用途,也许是为了编译器或其他什么,但无论它是什么
int.class
,double.class
,甚至是void.class
我不明白的是为什么会有这些。它们似乎不起任何作用。使用反射,我搜索了所有类,它们没有构造函数,没有方法,也没有字段。无论出于何种目的,它们都显得空洞无用。基元类型变量甚至不是其各自类的实例,如下返回false所示:
int a = 3;
int.class.isInstance(a);
那么,它们为什么存在呢?它们必须有一定的用途,也许是为了编译器或其他什么,但无论它是什么,我都无法理解。中甚至有一个对int.class
的显式引用(对于每个基本类型及其相应的包装器对象也是如此)。我在JLS中找不到任何关于它们存在的参考,更不用说它们的使用了
我不明白的是为什么会有这些
考虑以下几点:
public int foo() {
return 0;
}
...
Method method = someClass.getDeclaredMethod("foo");
Class<?> clazz = method.getReturnType();
public int foo(){
返回0;
}
...
Method=someClass.getDeclaredMethod(“foo”);
类clazz=method.getReturnType();
如果没有类
表示的int
,上面会返回什么?它不应该返回Integer.class
,因为它们不是一回事。(想象一下,试图区分重载的方法,一个是使用int
的方法,另一个是使用Integer
参数的方法。)
我以前使用过这些类,在通过反射调用参数时为参数提供默认值。基于参数类型,我对任何引用类型使用了
null
,对每个基本类型使用了一些(显然是装箱的)基本值。这是一个廉价的解决方案,结果很糟糕
在1.5之前,Java类型可以分为
java type
primitive type
reference type
class type (including interface)
array type
理想情况下,java反射应该提供反映这5种类型的5个概念。但是他们使用一个类来表示它们,包括原语和数组类型。因此,类
不一定意味着类
这仍然是可以控制的。但是在1.5之后,Java类型变得更加复杂,因此引入了一种新的类型。不幸的是,他们没有直接镜像语言规范的新的干净的层次结构,而是决定将类
作为类型
的子类型;不仅旧的混乱被引入,它还产生了一些新的混乱,整个类型
层次结构是不可理解的。@Jeff:不,反射不仅仅由编译器使用,是吗?@Jeff:什么?不,我从来没有建议编译器那样做。你从哪里得到这个主意的?我建议,int.class
等对于反射API中的值非常有用,在反射API中,我们需要能够表示作为基本类型的返回类型或参数类型。请注意,我的答案中甚至没有“编译器”一词。一个用例:实现Swing TableModel的getColumnClass()。@Jeff:没有,我提供了调用getDeclaredMethod()
和getReturnType()
…的用户代码,尽管我同意Type
是一个棘手的问题,我认为这与这个问题没有多大关系。这样说吧:我相信这个问题在Java 1.4的时候仍然有意义,但你的答案不会。从第一天开始,int.class
和“class for int”
都是廉价的肮脏黑客。在1.5之前,这并不是什么大不了的事,但现在在引入更多类型之后,错误就更加明显了。我当然更喜欢C#语法,但我仍然认为你的答案与问题没有太大关系,更像是离题的咆哮。