Java 中的强制类型转换

2025 年 9 月 2 日 | 阅读 3 分钟

许多编程语言,包括 Java,为了方便程序员,允许将一种数据类型转换为另一种数据类型。转换的类型可以是隐式的,也可以是显式的。 隐式转换由 JVM 自动完成,而显式转换由程序员完成。

在本节中,我们将讨论强制类型转换(也称为类型转换)。

什么是强制类型转换?

在 Java 中,将一种类型的对象转换为具有相似内容的不同类型的另一种对象,这种机制称为强制类型转换。换句话说,我们可以说强制类型转换是将一种数据类型转换为另一种数据类型的过程。更具体地说,隐式转换称为强制类型转换。它也被称为类型强制转换

这是因为数据(信息)以一种数据类型存储,但其上下文需要另一种不同的数据类型。例如,常数(sum)20 是一个整数,但其上下文需要一个双精度值。

强制类型转换的例子

字符串转换为整数,将长整数转换为双精度数都属于强制类型转换。

另一个例子,如果我们想将 StringBuffer 强制转换为整数,在这种情况下,将执行以下一系列强制类型转换。

考虑以下代码语句。在第三个语句中,count 的值在执行除法(/)运算符之前会自动转换为双精度。

在程序执行时,数据会进行一次隐藏的机器操作。

  • 获取 sum 变量的值。
  • 获取 count 变量的值。
  • 将 count 变量的值转换为浮点数。
  • 执行浮点数除法。
  • 将结果存储在分配给 avg 变量的内存中。

数字数据强制类型转换

下图显示了 Java 数字数据类型之间的类型转换。

Coercion in Java

Java 将自动按照箭头(实线或虚线)的方向强制转换数据。例如

强制类型转换结果
int a = 'A';a = 65
long b = 'A';b = 65
double c = 'A';c = 65.0

穿越虚线的强制类型转换是允许的,但可能会导致精度损失。这意味着转换后的值可能不等于起始值。例如

强制类型转换结果
float d = 1_234_567_890;d = 1234567940.0
float e = 2_147_483_650L;e = 2147483648.0
double f = 3299734974313076465L;f = 3299734974313077000.0

如果任何语句尝试逆着箭头的方向强制转换数据,编译器就会报错。

强制类型转换结果
int x = 8437520981L;无法将 64 位 8437520981L 转换为 32 位 int。
float y = 55.891;无法将 64 位 55.891 转换为 32 位 float。

为了克服上述问题,我们可以使用类型转换来指定逆着箭头方向的数据转换。

类型转换和类型强制转换的区别

原始数据类型转换为另一种数据类型的过程称为类型转换或类型转换。有两种方法可以转换原始数据类型:扩展和收缩。它也被称为隐式类型转换,因为它是自动完成的。

类型转换是我们将一种对象类型视为另一种类型,而强制类型转换是将一种对象转换为另一种对象的过程。