为什么当Int扩展AnyVal时将Int => Int传递给采用AnyVal => Int的函数会导致类型不匹配?

时间:2019-11-24 22:59:27

标签: scala contravariance

我是scala的新手,我在将func作为参数传递给另一个func时遇到了一些困难。我尝试传递的函数应该有一个参数,但是我不知道它的类型(但是它确实是一个值):

object Sing
    def myFunc(myinnerfunc:(AnyVal)=>Int):Anyval
    {
    ...
    }

object main {
  def main(args : Array[String]): Unit ={
    val a = Sing.myFunc((x:Int)=>2*x:Int)
  }
}

我得到的错误是:

type mismatch : 
found : (Int)=>Int
required : (AnyVal)=>Int

2 个答案:

答案 0 :(得分:4)

尽管Int扩展了AnyVal,但函数myFunc无法接受Int => Int,因为在Scala函数中是

  

contravariant的参数类型,以及其参数的协变   返回类型

这意味着Int => Int不是的子类型AnyVal => Int。 如果您知道函数参数是数字类型,请考虑使用Numeric这样的类型类解决方案

def myFunc[T](myinnerfunc: T => Int)(implicit num: Numeric[T]): T = ???

答案 1 :(得分:2)

您不知道其类型,因此应使用通用类型。不能保证AnyVal是Int,因此您不能只通过Int传递函数:

def myFunc[T <: AnyVal](myinnerfunc: T => Int): Any = 0

myFunc((_: Int) * 2)