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;
()
}
}
}
42.0
,但没有调用任何转换函数(例如来自Predef
的函数)。因此,从Int
到Double
的转换必须发生在编译的早期阶段,而不是在运行时。<:w
的可传递性,Int
弱一致于Double
。Int <:w Long <:w Float <:w Double
e = 42
T = Int
pt = Double
42
将使用toDouble
转换为42.0
。由于它是一个可以在编译时处理的常量,所以我们在去糖后的代码中看不到toDouble
。然而,如果我们使用一个非常量值去糖类似的程序,则会看到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
已经在那里。
.toDouble
。 - allidoiswin