Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 为什么这里会出现类型不匹配错误?_Scala_Generics_Type Mismatch - Fatal编程技术网

Scala 为什么这里会出现类型不匹配错误?

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

我无法理解为什么下面的代码给出类型不匹配错误- 这里我使用泛型,在第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]() : 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?请从代码段中删除这些行号…然后我们如何调用没有匿名函数的函数?那么我们如何调用没有匿名函数的函数呢?