原始浮点型到int型的转换是可能的,但引用类型不可能,为什么?



这可能是简单的答案,但我想知道细节。

// Narrowing Conversion
    float ff = Integer.MAX_VALUE;
    int ii = (int)ff;
    System.out.println("float: " + ff + " int: " + ii);
    // Reference Conversion
    Integer integer;
    Float floatt = 100F;
    integer = (Integer) floatt;

在上面的例子中,窄化转换可以正常工作,但是引用转换不能正常工作。

可以将float s转换为int s,但不能将包装器对象转换为不同的类型。您必须首先打开Float包装器,然后您可以将原语float转换为int

Java将自动装箱/拆箱原语及其包装类型,Java还将自动扩展原语类型。

让我们查看字节码以了解详细信息。使用javap -c查看字节码。代码

float ff = Integer.INT_MAX;
int ii = (int)ff;

编制

   0: ldc           #3                  // float 2.14748365E9f
   2: fstore_1
   3: fload_1
   4: f2i
   5: istore_2

如果它是基本类型转换,如您从字节码中看到的,f2i由编译器插入。(如第4行所示)。

另一方面,如果使用包装类,编译器不会插入任何类型转换指令。

这就是为什么不能强制转换它们的原因。

最新更新