考虑以下代码:
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。
但是通过附加或强制转换,我可以强制编译器保持我想要的方式。
我的问题是:
casting方法和appending方法有什么区别
最佳答案
将字母(l,d,f)附加到LITERAL只是为了向编译器指定该文字的类型。如果您在源代码中编写文字,则默认情况下它被视为 int 或 double。
相反的转换实际上是将现有值(例如 Math.pow 返回的 double)转换为另一种 java 类型。
转换原语可能会导致截断。例如,将 double 转换为 int 或 long 会丢失小数部分,将 big 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
}
如果您尝试将实例强制转换为非强制转换,则强制转换可能会导致 ClassCastException。
这不会发生在原语之间,它们由 jvm 自动转换。
例如调用:
aMethod(1);
会抛出异常,即使原始 int 可以转换为原始 long,Integer 的实例也无法转换为 Long 的实例,就像 Person 的实例无法转换为 Dog 一样.
关于java - 强制转换与附加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25695277/