【发布时间】:2011-12-12 10:02:08
【问题描述】:
我在编译时发现 Java 强类型检查不一致。 请看以下代码:
int sum = 0;
sum = 1; //is is OK
sum = 0.56786; //compile error because of precision loss, and strong typing
sum = sum + 2; //it is OK
sum += 2; //it is OK
sum = sum + 0.56787; //compile error again because of automatic conversion into double, and possible precision loss
sum += 0.56787; //this line is does the same thing as the previous line, but it does not give us a compile error, and javac does not complain about precision loss etc.
谁能给我解释一下?它是已知的错误,还是期望的行为? C++ 给出警告,C# 给出编译错误。
Java 会破坏强类型吗? 您可以将 += 替换为 -= 或 *= - 编译器可以接受所有内容。
【问题讨论】:
-
奇怪的是你将浮点数存储在 int 变量中
-
@KarelFrajtak 没有修饰符的十进制数(如
d或f)是双精度数,而不是浮点数。此外,我认为您可能错过了重点.. -
Java 显然在这里犯了一个错误。当允许无声演员时,他们应该更精确。演员阵容的原因在于另一个错误的决定。整数类型操作的规范是一团糟。
-
@irreputable:浮点类型的规则更糟糕。如果两者都允许,哪个更值得警告:
float f=1.0/10.0;或double d=1.0f/10.0f;?一种好的语言应该能够定义==运算符,因此它在所有编译的情况下都表现为等价关系(x==y编译和y==z编译的事实并不意味着x==z必须编译,但如果所有三个都编译,两个返回 true,第三个也应该),但是 Java 在很多方面都失败了。
标签: java strong-typing