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

时间:2015-07-19 03:12:49

标签: java casting

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

public Sprite buttonDown;
public Sprite buttonUp;

void OnMouseDown() {
    SpriteRenderer sr = gameObject.GetComponent<SpriteRenderer>();
    sr.sprite = buttonDown;
}

void OnMouseUp () {
    SpriteRenderer sr = gameObject.GetComponent<SpriteRenderer>();
    sr.sprite = buttonUp;
    Application.LoadLevel(1);
}

在上面的示例中,缩小转换正常工作但参考转换相同无效。细节解释非常值得注意。

2 个答案:

答案 0 :(得分:2)

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

Java将自动使用box / unbox原语及其包装类型,java也会自动扩展原始类型。但它不会同时做到这两点。

答案 1 :(得分:2)

让我们看一下字节码的详细信息。使用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行所示)。

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

这就是你无法施放它们的原因。