施法与追加

时间:2014-09-05 23:29:34

标签: java casting literals

请考虑以下代码:

int x = 300;
int y = 200;

float new_x = 300/1.2f;           // Appending 'f' to the end of operation
long new_y = (long)Math.pow(y,7); //Casting

执行这两个操作时,我的编译器想要将new_xnew_y转换为double。

但是通过追加或转换我可以强制编译器按照我想要的方式保持它。

我的问题是:

投射方法和追加方法有什么区别

1 个答案:

答案 0 :(得分:4)

在LITERAL中附加一个字母(l,d,f)只是为了向编译器指定你的文字类型。如果在源代码中编写文字,默认情况下它被视为int或double。

反过来说,实际上是将现有值(例如Math.pow返回的double)转换为另一种java类型。

转换基元会导致截断。例如,一个double转换为int或long将松散小数部分,将long long转换为int可能会导致完全不同的数字(如果long高于Integer.MAX_VALUE),并转换为short或byte是有更强的限制。

转换是一个更广泛的概念,您可以转换实例而不仅仅是基元:

public void aMethod(Number n) {
  Long l = (Long)n;  // Obviously will throw exception if you don't call it with a long
}

如果您尝试将实例强制转换为实例,则Casting可能会导致ClassCastException。

原语之间不会发生这种情况,这些原语由jvm自动转换。

例如致电:

aMethod(1);

将抛出一个异常,即使一个原始int可以被转换为一个原始的long,一个Integer的实例也不能被强制转换为Long的实例,就像Person的一个实例不能被强制转换为Dog一样