请考虑以下代码:
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_x
和new_y
转换为double。
但是通过追加或转换我可以强制编译器按照我想要的方式保持它。
我的问题是:
投射方法和追加方法有什么区别
答案 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一样