学习Java中自动类型推广

89 阅读3分钟

自动类型推广

类型推广是Java编程中的一种常见现象,它可以通过使用自动类型推广来自动实现原始数据类型。它也被称为自动数据类型推广。

有时,自动类型推广与类型转换相混淆,这不应该是这样的,因为转换是由程序员在系统编码时手动实现的。你还应该明白,数据类型一旦被推广就不能再 "去推广"。

重载是Java中的一个概念,不同的方法可以有一个共同的名字。然而,这些方法因其接受的参数或甚至其输入的数据类型而不同。

自动类型转换主要发生在方法重载中;因此,在开始之前,我们有义务清楚地了解这两个概念。

前提条件

要理解这篇文章,读者应该具备以下条件。

  • 对Java编程语言有基本了解。

原始数据类型和可接受的推广方式

  • 字节
  • char
  • int
  • long
  • float
  • 双数

下面是一个关于可能的类型推广的图解。

type promotions

下面的Java代码片段显示了变量的声明和2个变量的实例化,num1num2 ,每个字节。然后,它声明了一个int类型的变量mult1 ,预计将存储num1num2 的乘积。

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中很有价值,但它有时可能会导致编译混乱,如下面的说明图所示。

problem

这个错误是由自动类型推广引起的,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
    }
}

输出。

output

结论

尽管自动类型推广有很多好处,但有些要求并不支持它。例如,它只支持[类型转换]或拓宽。

这意味着[窄化]是不支持的;因此,窄化必须由程序员手动完成,这就提出了学习手动类型铸造的需要。