【问题标题】:Why am I getting a type-mismatch error, here?为什么我在这里收到类型不匹配错误?
【发布时间】:2016-08-27 01:57:41
【问题描述】:

我无法理解为什么下面的代码会出现类型不匹配错误 - 在这里,我使用泛型,在第 11 行它给出了类型不匹配错误。它不应该将 T 解释为 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 被推断为在第二个sn-p 中使用Int 调用,所以我希望在第一个代码sn-p 中也会发生同样的情况,但事实并非如此。为什么不呢?

【问题讨论】:

  • 如果要返回123,为什么要将返回类型声明为T
  • 请从您的代码 sn-ps 中删除这些行号...

标签: scala generics type-mismatch


【解决方案1】:

第一个 sn-p:

您收到错误,因为您在返回 Int 时为 Fun 指定了通用返回类型。

假设如果这个表达式被允许,现在考虑这两个语句:

Fun[Int]()    // would have returned 123

Fun[String]() // what would be output?

第一个语句会毫无问题地返回123,但在第二种情况下会输出什么?

这就是为什么不允许这样的表达方式。

第二次 sn-p:

在第二个 sn-p 中它可以工作,因为当您使用 exec[Int](() => 1) 时,您将传递一个文字函数作为参数,而在第一个 sn-p 中您给出 Fun 的定义。


为了进一步解释,如果你看一下exec的定义:

def exec[T]( f:() => T) : T

它需要一个Function0 函数(可以返回任何类型)作为参数。因此,当您调用exec[Int](() => 1) 时,您传递的是函数() => 1,它返回Int注意,这不是通用函数)。因此它有效。

在第一个 sn-p 中,您定义了一个具有通用返回类型的通用函数 Fun。但是从函数体中,您返回了 Int 值。

【讨论】:

  • 那我们如何在没有匿名函数的情况下调用函数呢?
【解决方案2】:

你的问题在这里:

def Fun[T]() : T = {
  println("Inside Fun with key ")
  123
}

你隐含地返回123。不是T 类型,而是Int 类型。所以编译器会报错。

如果您希望 Fun 始终返回 Int,您可以通过将其定义为 Fun(): Int = ... 来实现。

那你应该可以打电话了

exec[Int](Fun)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-04
    • 1970-01-01
    • 1970-01-01
    • 2022-06-29
    • 1970-01-01
    • 1970-01-01
    • 2019-03-18
    • 1970-01-01
    相关资源
    最近更新 更多