AnyVal 的 Scala 隐式解析不同吗?
Scala implicit resolution different for AnyVal?
我正在为除 AnyVals 之外的所有类型(例如 Long 和 Double 等)解析的伴随对象中定义隐式。我不确定为什么会这样? AnyVals 是否有不同的解析规则?
class X(val i:Int) {
def add[T](implicit x:SomeType[T])=println(x)
}
object X {
implicit def xx = XType
implicit def ll = LType
implicit def dd = DType
}
object Console {
def main(args: Array[String]): Unit = {
new X(3).add[X] // works fine
new X(3).add[Long] // error Error:(16, 16) could not find implicit value for parameter x: com.x.SomeType[Long]
new X(3).add[Double] // error Error:(16, 16) could not find implicit value for parameter x: com.x.SomeType[Double]
}
}
sealed trait SomeType[T]
case object XType extends SomeType[X]
case object LType extends SomeType[Long]
case object DType extends SomeType[Double]
编译器不知道如何解析 object X
中的这两个隐式:
implicit def ll = LType
implicit def dd = DType
调用 new X(3).add[X]
能够解析 SomeType[X]
,因为在查找隐式 SomeType[X]
时,编译器将在 X
的伴生对象(以及其他地方,请参阅 Where does Scala look for implicits?),它发现它是 implicit def xx = XType
.
对于SomeType[Long]
,编译器无法在范围内找到隐含的,也不在SomeType
或Long
的伴生对象中可用,因此失败。 SomeType[Double]
由于同样的原因失败。
如果您在 Console
中 import X._
它将起作用,因为这会将所有隐含项都包含在范围内。如果您想为不同类型提供 SomeType
s 的默认隐式实例,最好将它们放在 SomeType
.
的伴奏中
class X(val i:Int) {
def add[T](implicit x: SomeType[T]) = println(x)
}
sealed trait SomeType[T]
object SomeType {
implicit case object XType extends SomeType[X]
implicit case object LType extends SomeType[Long]
implicit case object DType extends SomeType[Double]
}
无论您在哪里调用,以下内容现在都可以使用:
scala> new X(3).add[X]
XType
scala> new X(3).add[Long]
LType
scala> new X(3).add[Double]
DType
总之与AnyVal
无关。您可以在其他人旁边添加 SomeType[String]
并遇到同样的问题。不同之处在于您正在特殊对待 X
。
我正在为除 AnyVals 之外的所有类型(例如 Long 和 Double 等)解析的伴随对象中定义隐式。我不确定为什么会这样? AnyVals 是否有不同的解析规则?
class X(val i:Int) {
def add[T](implicit x:SomeType[T])=println(x)
}
object X {
implicit def xx = XType
implicit def ll = LType
implicit def dd = DType
}
object Console {
def main(args: Array[String]): Unit = {
new X(3).add[X] // works fine
new X(3).add[Long] // error Error:(16, 16) could not find implicit value for parameter x: com.x.SomeType[Long]
new X(3).add[Double] // error Error:(16, 16) could not find implicit value for parameter x: com.x.SomeType[Double]
}
}
sealed trait SomeType[T]
case object XType extends SomeType[X]
case object LType extends SomeType[Long]
case object DType extends SomeType[Double]
编译器不知道如何解析 object X
中的这两个隐式:
implicit def ll = LType
implicit def dd = DType
调用 new X(3).add[X]
能够解析 SomeType[X]
,因为在查找隐式 SomeType[X]
时,编译器将在 X
的伴生对象(以及其他地方,请参阅 Where does Scala look for implicits?),它发现它是 implicit def xx = XType
.
对于SomeType[Long]
,编译器无法在范围内找到隐含的,也不在SomeType
或Long
的伴生对象中可用,因此失败。 SomeType[Double]
由于同样的原因失败。
如果您在 Console
中 import X._
它将起作用,因为这会将所有隐含项都包含在范围内。如果您想为不同类型提供 SomeType
s 的默认隐式实例,最好将它们放在 SomeType
.
class X(val i:Int) {
def add[T](implicit x: SomeType[T]) = println(x)
}
sealed trait SomeType[T]
object SomeType {
implicit case object XType extends SomeType[X]
implicit case object LType extends SomeType[Long]
implicit case object DType extends SomeType[Double]
}
无论您在哪里调用,以下内容现在都可以使用:
scala> new X(3).add[X]
XType
scala> new X(3).add[Long]
LType
scala> new X(3).add[Double]
DType
总之与AnyVal
无关。您可以在其他人旁边添加 SomeType[String]
并遇到同样的问题。不同之处在于您正在特殊对待 X
。