以下输出 0 而不是我想要的结果,即 2。这看起来类似于 这个问题,但在这里我到处都使用括号。
object Test {
implicit def x = List(1, 2)
trait A[T] {
def res(): Int = 0
def makeResPlusOne(): Int = res() + 1 // All right
}
trait B[T] extends A[T] {
def res()(implicit y: List[T]) = y.size
}
class AA extends A[Int]
class BB extends B[Int]
}
val x: Test.A[Int] = new Test.BB
x.res() // Outputs 0 instead of 2.
我希望最后一个结果显然是 2 的大小y
,但它输出 0。如果我将关键字添加override
到 in 的方法中B[T]
,它表示它不会覆盖任何内容。如果我像这样将隐式参数添加到方法 res in A[T]
...
object Test {
implicit def x = List(1, 2)
trait A[T] {
def res()(implicit y: List[T]): Int = 0 // Added the implicit keyword.
def makeResPlusOne(): Int = res() + 1 // Fails to compile.
}
trait B[T] extends A[T] {
override def res()(implicit y: List[T]) = y.size
}
class AA extends A[Int]
class BB extends B[Int]
}
val x: Test.A[Int] = new Test.BB
x.res() // Error
...它引发以下错误:
error: could not find implicit value for parameter y: List[Int]
我究竟做错了什么 ?如何在子类中获得隐式值的好处并且仍然能够重载超级方法?
编辑
如果我导入隐式,它会起作用。但是,我有方法makeResPlusOne()
,它会在第二种情况下触发错误,但不会在第一种情况下触发。请告诉我如何正确定义此方法,该方法通常在编译时不需要隐式。_
error: could not find implicit value for parameter y: List[T]
def makeResPlusOne(): Int = res() + 1
^