【发布时间】:2013-04-20 05:54:43
【问题描述】:
您可以这样做以获取到链的隐式转换:
package language
object chainedImplicits {
implicit def chainImplicits[A, B, C](a: A)(implicit conv1: A => B, conv2: B => C): C = conv2(conv1(a))
}
但这显然不安全。
不过,我看不出这个版本有什么问题:
package language
package chainedImplicits {
final class Chained[A, B] private[chainedImplicits] (val f: A => B)
trait Low { this: `package`.type =>
implicit def startChaining(implicit conv: A => B): Chained[A, B] = new Chained[A, B](conv)
implicit def chainImplicits[A, B, C](implicit conv1: Chained[A, B], conv2: B => C): Chained[B, C] = new Chained(conv1.f andThen conv2)
}
}
package object chainedImplicits extends Low {
implicit def endChain[A, B](a: A)(implicit conv: Chained[A, B]): B = conv.f(a)
}
这里有什么问题吗?
【问题讨论】:
-
为什么第一个代码块明显不安全? Scala 是否可以通过使用相同的具体类型实例化
A和C来创建无限的隐式链? -
@mhs 不,因为 Scala 只会在代码不会进行类型检查的情况下调用隐式转换。第一个的危险是隐含链可能不是唯一的模最终签名。
标签: scala implicit-conversion implicits