0

我尝试在 REPL的深度中从 Scala运行以下代码段:

val notNull[T]: T => Boolean = _ != null

口译员向我抛出了以下错误:

<console>:7: error: missing parameter type for expanded function ((x$1) => x$1.$bang$eq(null))
       val notNull[T]: T => Boolean = _ != null
                                      ^
<console>:7: error: not found: type T
       val notNull[T]: T => Boolean = _ != null
                       ^
<console>:7: error: not found: type notNull
       val notNull[T]: T => Boolean = _ != null
           ^
<console>:7: error: not found: type T
       val notNull[T]: T => Boolean = _ != null
                   ^

scala> val notNull[T](f1: T => Boolean) = _ != null
<console>:1: error: ')' expected but '=>' found.
       val notNull[T](f1: T => Boolean) = _ != null

也许我不理解这里的陈述,但书中的陈述基本上不是说,声明一个 T 类型的 val notNull ,它返回一个以 T 作为参数并返回布尔值的函数。`_!= null 通过获取参数并将其与 null 进行比较来执行函数,本质上返回一个布尔值?

为什么编译器会在这里抛出所有这些错误?

4

1 回答 1

3

它需要def工作。Val's 不能像那样一般地输入。这可能是因为该 val 是 Function1 的实例,并且类的实例需要具有实际类型。

def notNull[T]: T => Boolean = _ != null

当您像上面那样调用 notNull 时,它实际上会返回一个 function1 实例。

scala> val a = notNull[String]
a: (String) => Boolean = <function1>

scala> a(null)
res5: Boolean = false

scala> a("aa")
res6: Boolean = true

scala> a(5)
<console>:10: error: type mismatch;
 found   : Int(5)
 required: String
       a(5)
         ^

我认为这说明了为什么 val 不能被通用输入。

于 2012-11-16T04:04:05.057 回答