基于下面的代码片段:
// as primitive
MyClass.primitiveMethod(double val); // method signature
MyClass.primitiveMethod(12); // ok
// as object
MyClass.objectMethod(Double val); // method signature
MyClass.objectMethod(12); // error
MyClass.objectMethod(12d); // ok
MyClass.objectMethod((double)12); //ok
Run Code Online (Sandbox Code Playgroud)
Q1:虽然12d和(double)12似乎都有效,但指定后缀和显式转换之间有什么区别吗?(行为/表现)
Q2:为什么MyClass.objectMethod(12)一定要认为是错误?虽然 12 应该被解析为 Integer 对象,但是 Java 不能足够聪明地知道 12 也是一个 Double 值并接受它吗?
对于第一个问题:我希望转换由double编译器执行,但我不想在没有检查的情况下确定。为了清楚起见,我会使用后缀。(如果我需要检查,这意味着维护代码的任何人也必须检查......为什么不直接使用正确类型的文字来开始呢?)
12 被解析为int,而不是Integer- 并且没有从int到 的隐式转换Double。仅仅因为存在从int到 的隐式转换double和另一个从double到 的隐式转换Double并不意味着直接存在。
当然,它本来可以被包含在内 - 但这意味着使语言变得更加复杂,以获得相当小的好处。