自动类型推广
类型推广是Java编程中的一种常见现象,它可以通过使用自动类型推广来自动实现原始数据类型。它也被称为自动数据类型推广。
有时,自动类型推广与类型转换相混淆,这不应该是这样的,因为转换是由程序员在系统编码时手动实现的。你还应该明白,数据类型一旦被推广就不能再 "去推广"。
重载是Java中的一个概念,不同的方法可以有一个共同的名字。然而,这些方法因其接受的参数或甚至其输入的数据类型而不同。
自动类型转换主要发生在方法重载中;因此,在开始之前,我们有义务清楚地了解这两个概念。
前提条件
要理解这篇文章,读者应该具备以下条件。
- 对Java编程语言有基本了解。
原始数据类型和可接受的推广方式
- 字节
- char
- 短
- int
- long
- float
- 双数
下面是一个关于可能的类型推广的图解。

下面的Java代码片段显示了变量的声明和2个变量的实例化,num1 和num2 ,每个字节。然后,它声明了一个int类型的变量mult1 ,预计将存储num1 和num2 的乘积。
byte num1 = 200;
byte num2 = 50;
int mult1 = num1*num2;
当进行乘法运算时,乘积不能包含在byte 的位置上;因此,使用自动类型推广将字节自动推广到int,这样可以将乘积存储在int 。
自动类型推广的规则
在Java中执行表达式时必须遵循以下类型推广规则,以获得正确的结果。
- 所有类型为
byte,short, 和char的变量必须被自动类型推广到int。 - 如果参加操作的任何变量是
long,操作结果必须是long。 - 如果参与操作的任何变量是
float,操作结果必须是float。
下面的例子说明了这一点。
public class AutoTypePromotion {
public static void main(String[] args) {
short num1 = 6;
int num2 = 100;
float num3 = 7.67f;
float result2 = (num2-num1) * num3;
System.out.println("The output is: " + result2);
}
}
输出是720.98f ,是一个浮点值,证实了有关的规则。
- 如果参加操作的任何变量是
double,操作结果必须是double。
下面是一个说明这一规则的例子。
public class AutoTypePromotion {
public static void main(String[] args) {
int num1 = 100;
double num2 = 0.25;
double result1 = num1/num2;
System.out.println("The output: " + result1);
}
}
25.0的输出是一个双数,因为表达式的结果自动变成了双数,正如上述规则所说的。
使用方法重载的自动类型推广
package example;
class AutoTypepromotion
{
void average(int x, long y)
{
System.out.println((x+y)/2);
}
void average(int x, int y, int z)
{
System.out.println((x+y+z)3);
}
public static void main(String[] args)
{
AutoTypepromotion s = new AutoTypepromotion();
s.average(20, 24);
s.average(16, 2, 9);
}
}
上面的代码片段实现了方法重载,有两个函数,每个都叫average,参数不同。自动进行类型推广,使结果long ,因为操作中的一个操作数是long 。
由于自动类型推广而可能出现的问题
尽管自动类型推广在Java中很有价值,但它有时可能会导致编译混乱,如下面的说明图所示。

这个错误是由自动类型推广引起的,byte 到整个执行时间。因此,如果必须是字节,则需要明确地进行类型转换。
下面是一个完整的Java程序,说明了自动类型推广。
package com.dataflair.typeconversion;
public class AutomaticTypePromotion
{
public static void main(String[] args) {
float num4flt;
int num1integer;
short num2shrt;
byte num3byt;
double num5dble;
long num6lng;
// Above are variable declarations-datatypes are also indicated
num3byt = 27;
num2shrt = num3byt;
num1integer = num2shrt;
num6lng = num1integer;
num4flt = num6lng;
num5dble = num4flt;
// Print statements for outputs
System.out.println("Byte value "+ num3byt);
System.out.println("Short value "+num2shrt);
System.out.println("Integer value"+num1integer);
System.out.println("Long value "+num6lng);
System.out.println("Float value "+num4flt);
System.out.println("Long value "+num5dble);
//This illustrates automatic type promotion
}
}
输出。

结论
尽管自动类型推广有很多好处,但有些要求并不支持它。例如,它只支持[类型转换]或拓宽。
这意味着[窄化]是不支持的;因此,窄化必须由程序员手动完成,这就提出了学习手动类型铸造的需要。