特定の変更不可能な Java クラスのセットを簡単に操作できるように、いくつかの Scala 暗黙関数を定義しています。次の Scala コードは単純化された例ですが、明らかにクレイジーに見えます。現実の世界では、次のようなさまざまなメソッドで使用するために、Monkey、Tree、Duck から特定のリソース (年齢の数値ではなく) を暗黙的に取得しようとしていますpurchaseCandles()
。
// actually 3 Java classes I can not change:
case class Monkey(bananas: Int)
case class Tree(rings: Int)
case class Duck(quacks: Seq[String])
// implicits I created to make my life easier...
implicit def monkey2Age(monkey: Monkey): Int = monkey.bananas / 1000
implicit def tree2Age(tree: Tree): Int = tree.rings
implicit def duck2Age(duck: Duck): Int = duck.quacks.size / 100000
// one of several helper methods that I would like to define only once,
// only useful if they can use an implicit parameter.
def purchaseCandles()(implicit age: Int) = {
println(s"I'm going to buy $age candles!")
}
// examples of usage
{
implicit val guest = Monkey(10000)
purchaseCandles()
}
{
implicit val guest = Tree(50)
purchaseCandles()
}
{
implicit val guest = Duck(Seq("quack", "quack", "quack"))
purchaseCandles()
}
3 回発生するコンパイラ エラー:
could not find implicit value for parameter age: Int
purchaseCandles()
^
このサンプル コードが狂っているさまざまな方法はさておき、私の本当の疑問は、暗黙の値の暗黙の変換が Scala の暗黙のパラメーターを満たすことができるかということです。