在Scala

时间:2017-01-17 21:52:06

标签: scala implicit

我在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对象,它告诉我没有“足够的方法测试参数”。我想这是因为它无法在编译时定义实际的隐式值。这是真的还是问题不是别的什么?如果是,我该如何解决这个问题?

显然,这只是问题的简化,以便复制一个条件,我必须调用一个方法来声明一个以前不知道实际类型的隐式参数。

2 个答案:

答案 0 :(得分:6)

应该获得的错误是:

scala> def jump[A, B](a: A, b: B) : Boolean = test(a, b)
<console>: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)
                                               ^

为了使用通用testA调用B,编译器需要能够找到Implicit[A, B]的隐式实例。由于AB可以是任何,因此编译器可以找到test隐式的唯一方法是,如果您需要{{1}隐式}}:

jump

答案 1 :(得分:1)

为了能够定义def jump,需要将其定义为

def jump[A,B](a:A, b:B)(implicit i: Implicit[A,B]): Boolean = test(a,b)

你怀疑的是

隐含值计为需要传入的参数之一。

无论何处调用,都需要在范围内隐式定义类型为Implicit[A,B]的值。