当前位置: 首页 > 知识库问答 >
问题:

原语包装器和静态“类型”类对象

丁鹏鹍
2023-03-14
System.out.println(Boolean.class == Boolean.TYPE);
System.out.println(Boolean.TYPE.isInstance(Boolean.valueOf(true)));

两者的计算结果都为false。(顺便说一句,.equals比较是不必要的,因为类不会重写Object中的equals。)

boolean.classboolean.type都是class ,因为它们==可比,没有错误。比较两个具有不同声明的泛型类型的对象是非法的。

在进一步检查时,type字段将通过调用包私有的本机方法类#GetPrimitiveClass,如下所示:

public static final Class<Boolean> TYPE = Class.getPrimitiveClass("boolean");

除了Java文档对“表示基元类型”的模糊暗示之外,我找不到任何关于这方面的文档。这个领域有什么用处吗?它在包装类本身中没有使用。

(编辑)

System.out.println(boolean.class == Boolean.TYPE);

是真的。

还有一个用途是反射:

try {
    Constructor ctor = Boolean.class.getConstructor(Boolean.class);
} catch (Exception e) {
    System.out.println("NoSuchMethodException gets thrown");
}

try {
    Constructor ctor = Boolean.class.getConstructor(Boolean.TYPE);
    System.out.println(ctor.newInstance(true));
} catch (Exception e) {
    // (no exception thrown)
}

我找到了一些引证这一点的线程,比如这个。我想我来自谷歌所谓的“错误的一端”,在上面找不到任何结果。

但是考虑到“原语类”(boolean.classint.class等)的存在,这并不能真正解释类型字段的存在。基本上就是“就在那里”?我还是不太明白。

共有1个答案

鞠隐水
2023-03-14

表示基元类型的类在指定或检查获取或返回基元的方法时很有用。例如,如果您的类具有如下所示的方法

class Test {
    static int round(float val) {...}
}

如果您希望通过反射访问此方法,则需要执行以下操作:

Method round = Test.class.getMethod("round", Float.TYPE);

您也可以检查返回类型:

if (round.getReturnType == Integer.TYPE) {
    System.out.println("Method 'round' returns an int.");
}
Method round = Test.class.getMethod("round", Float.class);
static int round(Float val) {...}
 类似资料:
  • 我在看一个项目,我发现了一些很奇怪的东西。 现在,我认为唯一的两个优点是,在非静态容器中封装时,命名更加清晰,并且可以传递的参数更少。 但我想知道这是不是一个好主意,通过设计来包装静态类与非静态?如果有的话,还有哪些其他原因?因为我认为创建一个静态并对其进行调用是可以的。但是这个项目特意将所有静态类打包;我也不知道为什么。

  • 我试图了解Java原语和包装器是如何工作的。让我们考虑以下示例。 由于整数是不可变的和非原语,语句将编译为以下内容 这将创建大约10000个整数对象(每次调用新)和将整数拆箱为int的成本。 我说的对吗?

  • 一个机器或语言是用来计算的,根据计算机模型的定义,其操作的是存储器里的数据,就现在流行的用二进制实现的计算机中(曾出现过三进制计算机),数据本质都是0和1,但机器毕竟是为人服务的,解决的是现实问题,它操作的数据需要有现实的含义,所以基本上所有语言都有类型系统,即便是汇编和机器语言,也有整数和浮点的区别 类型系统是很复杂的理论,值得用一本厚书来写,好点的资料有《类型与程序设计语言》,但我没看懂,因为

  • 本文向大家介绍动态语言、动态类型语言、静态类型语言、强类型语言、弱类型语言介绍,包括了动态语言、动态类型语言、静态类型语言、强类型语言、弱类型语言介绍的使用技巧和注意事项,需要的朋友参考一下 关于如题这几个概念,大部分人应该比较熟悉,但是我昏了好久,所以写下来加深印象。 1. 动态语言 又叫动态编程语言,是指程序在运行时可以改变其结构:新的函数可以被引进,已有的函数可以被删除等在结构上的变化。比如

  • 封箱包装器 这些对象包装器服务于一个非常重要的目的。基本类型值没有属性或方法,所以为了访问 .length 或 .toString() 你需要这个值的对象包装器。值得庆幸的是,JS 将会自动地 封箱(也就是包装)基本类型值来满足这样的访问。 var a = "abc"; a.length; // 3 a.toUpperCase(); // "ABC" 那么,如果你想以通常的方式访问这些字符串值上的

  • 问题内容: 这是我的问题和我的项目结构 我有一个要使用的类型 但是,当我尝试将其添加到导入中时,这些问题会出现: 虽然我在函数声明中使用了它 这是什么问题? 我试图用导入 问题答案: 您不能“ 从 包中导入”。您所能做的就是“导入 整个 程序包”。这意味着,如果您和该程序包在开始时就声明自己被称为foo ,则该程序包中的所有内容都必须由以下字符限定: 如果调用了包,则声明变量将使整个包变色:因此,