我是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
答案 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)