【问题标题】:Explicit type casting vs using suffix for float/double Java - difference?显式类型转换与使用浮点/双精度 Java 的后缀 - 区别?
【发布时间】:2012-01-04 17:31:55
【问题描述】:

基于下面的sn-p:

    // 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

Q1:虽然12d(double)12 似乎都可以工作,但指定后缀和显式转换之间有什么区别吗? (行为/表现)

Q2:为什么必须将MyClass.objectMethod(12) 视为错误?虽然 12 应该被解析为一个 Integer 对象,但 Java 不能足够聪明地知道 12 也是一个值 Double 值并接受它吗?

【问题讨论】:

    标签: java


    【解决方案1】:

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

    12 被解析为int,而不是Integer - 并且没有从intDouble 的隐式转换。仅仅因为存在从 intdouble 的隐式转换以及从 doubleDouble 的隐式转换,并不意味着那里有一个直接的转换。

    当然,它可以被包括在内 - 但这意味着使语言变得更加复杂,从而获得很小的好处。

    【讨论】:

      【解决方案2】:

      坦率地说,我从不使用12d。为了明确数字是双精度数,我使用12.0。对于花车,你必须说12.0f

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

      添加

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

      objectMethod(Double.valueOf(12.0));
      

      虽然不得不承认,对于一些相对较小的事情来说,这是很多打字!但是,当取消自动装箱(例如,该方法返回 Double)时,我几乎总是说

      double d = result.doubleValue();
      

      它是值得的,因为它提醒了结果是一个对象,它可能为空。当你得到一些无法解释的 NPE 时,比如说,由于 FooBarServer 未连接,该方法返回 null,这将帮助你了解发生了什么。或者,更好的是,提醒原始代码先测试空结果!

      【讨论】:

        【解决方案3】:
        1. 使用后缀(字面量)
        2. 可能是,但似乎不是。 int 不会自动包装在 Double

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

        【讨论】:

          【解决方案4】:

          A1:不,在编译器完成它们之后它们最终都相同。

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

          【讨论】:

            【解决方案5】:

            '12d' 是一个双重文字。 '(double) 12' 是对 int 字面量的操作。你不能保证后者会优化到前者,而不是它可能会有所作为。正确键入的文字更清晰,更自记录,所以使用它。为什么要指定不必要的转换?

            【讨论】:

              【解决方案6】:

              对于第一个问题,使用后缀,12d更简洁明了。

              对于第二个...说 12 你正在使用 intprimitive 并且使用 Double 你正在谈论一个 对象double 的包装),它们不一样。

              【讨论】:

                猜你喜欢
                • 2017-08-05
                • 1970-01-01
                • 2023-03-18
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2015-02-20
                相关资源
                最近更新 更多