2

为什么这不起作用?

trait testtrait[T] {
  var ob:T = null
}

然后 scalac testtrait.scala 产生

testtrait.scala:2: error: type mismatch;
 found   : Null(null)
 required: T
  var ob:T = null
             ^
one error found

我正在使用 Scala 2.9

4

3 回答 3

5

null是 type 的值Null,但不是任何类型都有Null子类型,只有 -AnyRef派生的(Nothing当然,除了 )。假设你做了类似的事情

object SomeObj extends testtrait[Int]

SomeObj.ob应该等于什么?它是Int,因此它没有null作为可能的值。

正如在其他答案中所说,您应该使用下划线语法来设置类型的默认值。

于 2013-10-17T20:17:23.587 回答
5

我不能确切地说为什么,但是下划线概念(这是类型默认值的快捷方式,对于 objects 是 null)可以正常工作:

trait testtrait[T] {
  var ob:T = _
}

铸造了更可怕的解决方法asInstanceOf,但我发现下划线更好的选择。

trait testtrait[T] {
  var ob:T = null.asInstanceOf[T]
}
于 2013-10-17T19:18:34.863 回答
2

所有类型的底部类型是Nothing. 这意味着任何类型T,不受其他约束,都可以是Nothing,并且null不是 a Nothing(实际上,没有值是)。

因此,为了能够分配null,您必须编写它[T >: Null]T是 的超类型Null)。

另一方面,您可以使用 将其初始化为默认值var ob: T = _。但是,请注意,对于任何AnyVal,T将被装箱并分配null而不是 0,这可能会导致意外结果。

于 2013-10-17T21:29:32.103 回答