Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 基元类型类的用途是什么?_Java_Class_Primitive - Fatal编程技术网

Java 基元类型类的用途是什么?

Java 基元类型类的用途是什么?,java,class,primitive,Java,Class,Primitive,我最近了解到JVM中有一些基本类型的表示。例如,int.class,double.class,甚至是void.class 我不明白的是为什么会有这些。它们似乎不起任何作用。使用反射,我搜索了所有类,它们没有构造函数,没有方法,也没有字段。无论出于何种目的,它们都显得空洞无用。基元类型变量甚至不是其各自类的实例,如下返回false所示: int a = 3; int.class.isInstance(a); 那么,它们为什么存在呢?它们必须有一定的用途,也许是为了编译器或其他什么,但无论它是什么

我最近了解到JVM中有一些基本类型的表示。例如,
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#语法,但我仍然认为你的答案与问题没有太大关系,更像是离题的咆哮。