java - 强制转换与附加

标签 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。

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

我的问题是:

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/

相关文章:

java - 在 hibernate : is it possible to mix Annotations and XML configuration for an Entity?

java - @Resource 与 @Autowired

ios - 如何在单个变量中分配不同类型?

c# - 类型转换盒装字节

C#:如何使用类型执行 'as' 操作

java - JFreeChart:周期为 n 毫秒的 DynamicTimeSeries

string - 我怎样才能使用带有格式的动态格式字符串!宏观?

go - 使用数字文字但不使用数字常量的移位运算符会出错

python - 解释器维护的整数缓存是怎么回事?

java - 如何使用 Spring Boot/Keycloak 验证后端到后端