隐式参数的默认行为

时间:2015-06-08 14:26:21

标签: scala implicit

是否可以为类的隐式参数表示默认值?

class I[T](val t: T)

class A(i: I[Int])(implicit f: I[Int] => Int) {

    implicit object key extends(I[Int] => Int) {
      def apply(i: I[Int])= i.t
    } 

    def this() = this(new I(0))(key)
}

上面的代码给出了“错误:找不到:值键”

1 个答案:

答案 0 :(得分:3)

您不能在构造函数中引用类的成员,因为该类尚未构造。即keyA的成员,因此您无法在类构造函数中引用key。但是,您可以使用默认参数作为匿名函数:

scala> class A(i: I[Int])(implicit f: I[Int] => Int = { i: I[Int] => i.t } )
defined class A

scala> new A(new I(2))
res1: A = A@29ba4338

,如果你想让它更干净一点,你可以在A的伴侣对象中创建一个方法,然后引用它。

case class A(i: I[Int])(implicit f: I[Int] => Int = A.key)

object A {
    def key(i: I[Int]): Int = i.t
}

甚至:

case class A(i: I[Int])(implicit f: I[Int] => Int) {
    def this() = this(new I(0))(A.key)
}

object A {
    def key(i: I[Int]): Int = i.t
}