我在Scala中实现了以下代码
trait Implicit[A,B] { def method1(a:A, b:B) : Boolean } object Implicit { implicit object IntImplicit extends Implicit[Int,Int] { override def method1(a: Int, b: Int): Boolean = a == b } } object Main { def main(args:Array[String]) : Unit = { println(test(4,3)) } def test[A,B](a:A, b:B)(implicit i: Implicit[A,B]) : Boolean = i.method1(a,b) }
它实际上工作正常.但是,如果我定义以下功能
def jump[A,B](a:A, b:B) : Boolean = test(a,b)
进入Main对象,它告诉我没有"足够的方法测试参数".我想这是因为它无法在编译时定义实际的隐式值.是真的还是问题不是别的什么?如果是,我该如何解决这个问题?
显然,这只是问题的简化,以便复制一个条件,我必须调用一个方法来声明一个先前不知道实际类型的隐式参数.
你应该得到的错误是:
scala> def jump[A, B](a: A, b: B) : Boolean = test(a, b):14: error: could not find implicit value for parameter i: Implicit[A,B] def jump[A, B](a: A, b: B) : Boolean = test(a, b) ^
为了调用test
与通用A
和B
,编译器需要能够找到的隐式实例Implicit[A, B]
.既然A
也B
可以是任何东西,编译器可以找到这种隐式的唯一方法test
是,如果你需要相同的隐式jump
:
def jump[A, B](a: A, b: B)(implicit i: Implicit[A, B]) : Boolean = test(a, b)