【问题标题】:What is wrong with the val notNull[T]: T => Boolean = _ != null from Scala in Depthval notNull[T]: T => Boolean = _ != null from Scala in Depth 有什么问题
【发布时间】:2012-11-16 03:59:36
【问题描述】:

我尝试在 REPL 中从 Scala in Depth 运行以下 sn-p:

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 进行比较来执行函数,本质上返回一个布尔值?

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

【问题讨论】:

    标签: function scala


    【解决方案1】:

    它必须是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 不能被通用类型化。

    【讨论】:

    • Vals 可以(并且总是)输入,Function1val 的完全正常类型。它们不能是 generic(即具有像 [T] 这样的类型参数)。
    • 错了,这就是我所说的打字的意思——我最初是一般打字的——但对确切的术语感到困惑。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-15
    • 2019-03-05
    • 1970-01-01
    • 2014-05-06
    • 2011-03-25
    • 1970-01-01
    相关资源
    最近更新 更多