显式类型转换与使用 float/double Java 后缀 - 区别?

kct*_*ang 5 java

基于下面的代码片段:

    // 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 值并接受它吗?

Jon*_*eet 4

对于第一个问题:我希望转换double编译器执行,但我不想在没有检查的情况下确定。为了清楚起见,我会使用后缀。(如果我需要检查,这意味着维护代码的任何人也必须检查......为什么不直接使用正确类型的文字来开始呢?)

12 被解析为int,而不是Integer- 并且没有从int到 的隐式转换Double。仅仅因为存在从int到 的隐式转换double和另一个从double到 的隐式转换Double并不意味着直接存在。

当然,它本来可以被包含在内 - 但这意味着使语言变得更加复杂,以获得相当小的好处。