加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala如何将Int转换为Double?

发布时间:2020-12-16 18:35:01 所属栏目:安全 来源:网络整理
导读:val d: Double = 42 当我试图通过intellij找到隐式转换时,没有任何有趣的东西出现.此外,Int不是Double的子类型.那么Scala是如何做到的呢? 解决方法 长话短说:它不是对某些伴随物体的普通隐式转换,数值类型得到特殊处理. 如果我们在这个脚本上运行scala -pr
val d: Double = 42

当我试图通过intellij找到隐式转换时,没有任何有趣的东西出现.此外,Int不是Double的子类型.那么Scala是如何做到的呢?

解决方法

长话短说:它不是对某些伴随物体的普通隐式转换,数值类型得到特殊处理.

如果我们在这个脚本上运行scala -print:

val d: Double = 42

我们获得:

package <empty> {
  object Main extends Object {
    def main(args: Array[String]): Unit = {
      new <$anon: Object>();
      ()
    };
    def <init>(): Main.type = {
      Main.super.<init>();
      ()
    }
  };
  final class anon$1 extends Object {
    private[this] val d: Double = _;
    <stable> <accessor> private def d(): Double = anon$1.this.d;
    def <init>(): <$anon: Object> = {
      anon$1.super.<init>();
      anon$1.this.d = 42.0;
      ()
    }
  }
}

在desugared代码中,我们看到双字42.0,但没有任何转换的调用
功能(例如来自Predef).因此,必须不进行从Int到Double的转换
在运行时,但在编译的早期阶段.

section 3.5.3 of the specification
告诉我们由于弱一致性关系<:w的传递性,Int弱于符合Double:

Int <:w Long <:w Float <:w Double

此外,Section 6.26.1 (Value Conversions)
告诉我们,如果类型T的表达式e出现在表达式的位置,则数字扩展的规则是适用的
类型pt是预期的,T弱符合pt.在这种情况下,我们可以应用规则

>表达式e = 42
>表达式类型T = Int
>预期类型pt = Double

因此,使用toDouble将42转换为42.0.因为它是一个可以在编译时处理的常量,
我们没有在desugared代码中看到toDouble.但是,如果我们用非常数来减少类似的程序

val d: Double = (new scala.util.Random).nextInt(42)

我们获得:

package <empty> {
  object Main extends Object {
    def main(args: Array[String]): Unit = {
      new <$anon: Object>();
      ()
    };
    def <init>(): Main.type = {
      Main.super.<init>();
      ()
    }
  };
  final class anon$1 extends Object {
    private[this] val d: Double = _;
    <stable> <accessor> private def d(): Double = anon$1.this.d;
    def <init>(): <$anon: Object> = {
      anon$1.super.<init>();
      anon$1.this.d = new scala.util.Random().nextInt(42).toDouble();
      ()
    }
  }
}

并且指定了toDouble.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读