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

显式类型转换与使用float/double Java后缀-区别?,java,Java,基于以下代码段: // as primitive MyClass.primitiveMethod(double val); // method signature MyClass.primitiveMethod(12); // ok // as object MyClass.objectMethod(Double val); // method signature MyClass.objectMethod(12);

基于以下代码段:

    // 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
问题1:虽然
12d
(double)12
似乎都有效,但指定后缀和显式转换之间有什么区别吗?(行为/表现)


问题2:为什么必须将
MyClass.objectMethod(12)
视为错误?虽然12应该被解析为一个整数对象,但Java难道不能聪明到知道12也是一个值双精度值并接受它吗?

关于第一个问题:我希望编译器执行到
Double
的转换,但我不想在不检查的情况下肯定地说。为了清楚起见,我会使用后缀。(如果我需要检查,这意味着任何维护代码的人也必须检查……为什么不使用正确类型的文本作为开始?)

12解析为
int
,而不是
整数
——并且没有从
int
Double
的隐式转换。仅仅因为有一个从
int
double
的隐式转换,还有一个从
double
double
的隐式转换,并不意味着有一个直接的转换

当然,它本可以被包括在内,但这意味着为了一个相当小的好处而使语言更加复杂

  • 使用后缀(文字)
  • 可能是,但似乎不是
    int
    不会自动包装在
    Double

  • 但最重要的是-更喜欢原语而不是包装器。

    A1:不,在编译器使用它们之后,它们最终都是一样的


    A2:
    int
    原语自动装箱到
    整数
    对象。请参阅Java语言规范。您希望Java猜测您的意思并为您更改对象类吗?不,程序员告诉机器该做什么比让机器猜测程序员的意图要好得多。

    '12d'是一个双重文本(double)12'是对整型文字的操作。您不能保证后者会优化到前者,也不能保证它可能会有所不同。正确类型的文本更干净,更易于自我记录,因此请使用它。为什么要指定不必要的转换?

    对于第一个问题,请使用后缀,12d更简短、更清晰


    第二次。。。说12你使用的是int,primitive和Double你说的是一个对象(Double的包装器),它们是不同的

    坦白说,我从不使用
    12d
    。为了明确数字是双精度的,我使用了
    12.0
    。对于浮动,您必须说
    12.0f

    这是一个额外的字符类型,但我发现它迄今为止最“自然”。YMMV

    增加

    至于您的实际问题,自动装箱原语到包装器和从包装器到包装器可能会产生意想不到的结果(这对Java难题书来说是一个巨大的福音!),我更愿意尽可能避免它。如果该方法需要一个Double,在调用代码中我通常会显式地这样做

    objectMethod(Double.valueOf(12.0));
    
    虽然我不得不承认,这是一个相对次要的东西打字很多!然而,当反自动装箱(比如,该方法返回一个Double)时,我几乎总是说

    double d = result.doubleValue();
    
    这是值得的,因为它提醒我们结果是一个对象,它可能是空的。当您得到一些无法解释的NPE时,例如,由于FooBarServer未连接,该方法返回null,这将帮助您了解发生了什么。或者,更好的是,提醒原始代码先测试空结果