nul*_*ull 5 scala implicit-conversion
我在这里阅读了其他相同的问题,但是对于某些内置类来说,这种情况太具体了。我想在这里问一个简单的案例,希望能得到一般的答案。
所以我有这段代码:
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
}
}
Run Code Online (Sandbox Code Playgroud)
我们可以看到,将错误p应用于\方法然后触发隐式转换。Scala编译器将尝试查找已def \(i: Int)定义方法的任何导入或本地类。如果找到,则它将尝试查找任何采用Point类型的隐式转换方法,并返回具有def \(i: Int)方法签名的对象的类型。
碰巧有两个类def \在这里有方法:Rational和MyObject,也有两个隐式方法:pointToRational和pointToMyObject对于这两个类。
然而,由于双方Rational并MyObject已def \确定,因此不明确的编译错误发生,因为它不能决定哪一个应该采取。
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
^
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,有一种方法可以解决模棱两可的隐式错误,但仍保留这两种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)
Run Code Online (Sandbox Code Playgroud)
因此,您可以将其放入代码中,而不是:
val result = p \ 6 // compile error here
Run Code Online (Sandbox Code Playgroud)
另一种方式是将你的隐式转移到单独的对象中:
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
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2384 次 |
| 最近记录: |