这可能是简单的答案,但我想知道细节。
// 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行所示)。
另一方面,如果使用包装类,编译器不会插入任何类型转换指令。
这就是为什么不能强制转换它们的原因。