gpt4 book ai didi

scala - scala中从Int到Double的隐式转换不起作用

转载 作者:行者123 更新时间:2023-12-04 01:53:51 25 4
gpt4 key购买 nike

我写了一些如下所示的隐式代码,我想知道为什么 i2d不调用函数隐式对话。

object Test {
implicit def i2d(x: Int): Double = {
println("foo")
x.toDouble
}

implicit def d2i(x: Double): Int = {
x.toInt
}

val x: Int = 10
val y: Double = x
val z: Int = 3.5
}

输出 scalac -Xprint:typer Test.scala
// Test.scala
[[syntax trees at end of typer]]
package <empty> {
object Test extends scala.AnyRef {
def <init>(): Test.type = {
Test.super.<init>();
()
};
implicit def i2d(x: Int): Double = {
scala.this.Predef.println("foo");
x.toDouble
};
implicit def d2i(x: Double): Int = x.toInt;
private[this] val x: Int = 10;
<stable> <accessor> def x: Int = Test.this.x;
private[this] val y: Double = Test.this.x.toDouble;
<stable> <accessor> def y: Double = Test.this.y;
private[this] val z: Int = Test.this.d2i(3.5);
<stable> <accessor> def z: Int = Test.this.z
}
}

规范
  • scalac 版本是 2.11.8。
  • 最佳答案

    这比我想象的要复杂得多。

    起初,我认为这是因为 Scala 是如何解析隐式的。不知怎的,我想this implicit in Int.scala 被优先考虑。优先级的规则通常很直观,但是对于像这样的边缘情况,我们引用 6.26.3 Overloading Resolution .不过让我感到困惑的是对 int2double 的调用。不存在 - 它已经内联到 .toDouble !!

    深入挖掘后,似乎有一个关于值类型的极端情况,适用于从 Int 的转换。至Double .叫做 weak conformance 的东西指示我们如何转换 Byte -> Short -> Int -> Long -> Float -> Double .所以,总而言之,我认为你不能覆盖这个内置转换......

    此转换称为 numeric widening

    Numeric Widening

    If e has a primitive number type which weakly conforms to the expected type, it is widened to the expected type using one of the numeric conversion methods toShort, toChar, toInt, toLong, toFloat, toDouble...



    编辑

    另外,如果有人想知道为什么会这样,来自 Martin Odersky (这是一个旧链接 - 不要相信这里所说的一般),如果我们没有这些额外的特殊转换,我们会遇到常见问题:

    scala-hypothetical> val x = List(1, 2.0) 
    x: List[AnyVal]

    Not very intuitive...

    关于scala - scala中从Int到Double的隐式转换不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38966603/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com