gpt4 book ai didi

scala - 如何解决在 Scala 中采用相同输入类型的模糊隐式转换方法?

转载 作者:行者123 更新时间:2023-12-04 19:04:43 27 4
gpt4 key购买 nike

我读过其他相同的 question然而,这里的情况对于某些内置类来说太具体了。我想在这里问一个简单的案例,并希望得到一般性的答案。

所以我有这个代码:

object ScalaApp {    
case class Point(x: Int, y: Int);

case class Rational(n: Int, d: Int) {
def \(i: Int): List[Int] = n :: d:: i :: Nil
}

case class MyObject(x: Int, y: Int, z: Int) {
def \(i: Int): List[Int] = x :: y:: i :: Nil
}

implicit def pointToRational(p: Point): Rational = Rational(p.x + 1, p.y * 2)

implicit def pointToMyObject(p: Point): MyObject = MyObject(p.x, p.y, p.x+p.y)

def main(args: Array[String]) {
val p = Point(5, 7)
val result = p \ 6 // compile error here
}
}

我们可以看到错误发生在 p 时适用于 \方法然后触发隐式转换。 Scala 编译器将尝试查找任何具有 def \(i: Int) 的导入或本地类。方法定义。如果找到,那么它将尝试查找任何采用 Point 的隐式转换方法。输入并返回具有 def \(i: Int) 的对象的类型方法签名。

碰巧有两个类具有 def \方法在这里: RationalMyObject ,还有两个隐式方法: pointToRationalpointToMyObject对于那两个类。

然而,由于 RationalMyObjectdef \定义,因此发生了模棱两可的编译错误,因为它无法决定应该采用哪一个。
Error:(30, 22) type mismatch;
found : p.type (with underlying type ScalaApp.Point)
required: ?{def \(x$1: ? >: Int(6)): ?}
Note that implicit conversions are not applicable because they are ambiguous:
both method pointToRational in object ScalaApp of type (p: ScalaApp.Point)ScalaApp.Rational
and method pointToObj in object ScalaApp of type (p: ScalaApp.Point)ScalaApp.MyObject
are possible conversion functions from p.type to ?{def \(x$1: ? >: Int(6)): ?}
val result = p \ 6
^

所以我的问题是,有没有办法解决含糊不清的隐式错误,但仍保留两个 def \方法或不删除隐式转换方法之一?

最佳答案

你可以这样做:

scala> val result = (p: Rational) \ 6 
result: List[Int] = List(6, 14, 6)

scala> val result = (p: MyObject) \ 6
result: List[Int] = List(5, 7, 6)

所以你可以把它放在你的代码中而不是:
val result = p \ 6    // compile error here

另一种方法是将您的隐式移动到单独的对象中:
 object Implicits {
implicit def pointToRational(p: Point): Rational = Rational(p.x + 1, p.y * 2)

implicit def pointToMyObject(p: Point): MyObject = MyObject(p.x, p.y, p.x+p.y)
}

def main(args: Array[String]) {
val p = Point(5, 7)
import Implicits.pointToMyObject
val result = p \ 6
}

关于scala - 如何解决在 Scala 中采用相同输入类型的模糊隐式转换方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27875519/

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