Scala 为什么这里会出现类型不匹配错误?
我无法理解为什么下面的代码给出类型不匹配错误- 这里我使用泛型,在第11行它给出了类型不匹配错误。它不应该解释为Int吗Scala 为什么这里会出现类型不匹配错误?,scala,generics,type-mismatch,Scala,Generics,Type Mismatch,我无法理解为什么下面的代码给出类型不匹配错误- 这里我使用泛型,在第11行它给出了类型不匹配错误。它不应该解释为Int吗 object FunctionParamGeneric { def main(args: Array[String]) : Unit= { exec[Int](Fun[Int]) } def exec[T]( f:() => T) : T = { println("Inside exec") f() } def Fun[T
object FunctionParamGeneric {
def main(args: Array[String]) : Unit= {
exec[Int](Fun[Int])
}
def exec[T]( f:() => T) : T = {
println("Inside exec")
f()
}
def Fun[T]() : T = {
println("Inside Fun with key ")
123
}
}
然而,如果我这样做
object FunctionParamGeneric {
def main (args: Array[String]) : Unit= {
exec[Int](() => 1)
}
def exec[T]( f:() => T) : T = {
println("Inside exec")
f()
}
}
它很好用。因为f在第二个代码段中被推断为使用Int调用,所以我希望在第一个代码段中也会发生同样的情况,但事实并非如此。为什么不呢?您的问题在于:
def Fun[T]() : T = {
println("Inside Fun with key ")
123
}
您隐式返回123。它不是t类型,而是Int类型。因此编译器生成一个错误
如果你想让Fun总是返回一个Int,你可以通过定义它为Fun:Int=
那你就可以打电话了
exec[Int](Fun)
你的问题在于:
def Fun[T]() : T = {
println("Inside Fun with key ")
123
}
您隐式返回123。它不是t类型,而是Int类型。因此编译器生成一个错误
如果你想让Fun总是返回一个Int,你可以通过定义它为Fun:Int=
那你就可以打电话了
exec[Int](Fun)
第一段:
您得到错误,因为您在返回Int时指定了通用返回类型
假设这个表达式是允许的,现在考虑这两个语句:
Fun[Int]() // would have returned 123
Fun[String]() // what would be output?
第一条语句将返回123,没有任何问题,但第二种情况下的输出是什么
这就是为什么不允许这样的表达
第二段:
在第二个代码段中,它是有效的,因为当您使用exec[Int]=>1时,您将传递一个文本函数作为参数,而在第一个代码段中,您将给出Fun的定义
为了进一步解释,如果您看一下exec的定义:
它采用Function0函数,该函数可以返回任何类型作为参数。因此,当您调用exec[Int]=>1时,您传递的是返回Int的function=>1。请注意,这不是一个通用函数。因此它是有效的
在第一个代码段中,您使用泛型返回类型定义了一个泛型函数。但是从函数体返回Int值。第一个代码段:
您得到错误,因为您在返回Int时指定了通用返回类型
假设这个表达式是允许的,现在考虑这两个语句:
Fun[Int]() // would have returned 123
Fun[String]() // what would be output?
第一条语句将返回123,没有任何问题,但第二种情况下的输出是什么
这就是为什么不允许这样的表达
第二段:
在第二个代码段中,它是有效的,因为当您使用exec[Int]=>1时,您将传递一个文本函数作为参数,而在第一个代码段中,您将给出Fun的定义
为了进一步解释,如果您看一下exec的定义:
它采用Function0函数,该函数可以返回任何类型作为参数。因此,当您调用exec[Int]=>1时,您传递的是返回Int的function=>1。请注意,这不是一个通用函数。因此它是有效的
在第一个代码段中,您使用泛型返回类型定义了一个泛型函数。但是从函数体返回Int值。如果要返回123,为什么要将返回类型声明为T?请从代码段中删除这些行号…如果要返回123,为什么要将返回类型声明为T?请从代码段中删除这些行号…然后我们如何调用没有匿名函数的函数?那么我们如何调用没有匿名函数的函数呢?