以下Scala代码无法在Scala 2.7.7中编译,并且在最后一行出现类型不匹配错误“found:Null(null)required:T”:
/**
* @param [T] key type
*/
class Key[T]
class Entry[T](val k: Key[T], val v: T)
def makeEntry[T <: AnyRef] = new Entry[T](new Key[T], null)
我完全了解null的邪恶,但足以说我实际上需要这样做。这是编译错误还是程序员错误?
编辑:为了澄清,T是一个类型参数而不是具体类型。在我更仔细地阅读卡尔的回答之前,我没有意识到这在原始问题上是模棱两可的。
答案 0 :(得分:7)
显然,在2.7中执行此操作的correct way是:
class Key[T]
class Entry[T](val k: Key[T], val v: T)
def makeEntry[T >: Null] = new Entry(new Key[T], null)
答案 1 :(得分:4)
以下是涵盖null
的定义:
Type Null是所有引用类型的子类型;它唯一的例子是空引用。由于Null不是值类型的子类型,因此null不是任何此类型的成员。例如,无法将null赋给Int。
类型的变量
在英语中,这表示您不能将null
分配给值类型,但它可以分配给任何引用类型。
我在确定T
是值还是引用类型时遇到了一些麻烦;但这会回答你的问题。
当您将T
定义为AnyRef
的子类型时,我猜这是一个参考,并且“bug”解释似乎更有可能;特别是Mitch Blevins刚才说代码工作在2.8以下。
答案 2 :(得分:2)
试试这个:
class Key[T <: AnyRef]
class Entry[T <: AnyRef](val k: Key[T], val v: T)
def makeEntry[T <: AnyRef] = new Entry[T](new Key[T], null.asInstanceOf[T])
我不确定为什么需要“asInstanceOf [T]”,但似乎是。
答案 3 :(得分:1)
你试过这个吗?
def makeEntry[T <: AnyRef] = new Entry[T](new Key[T], null: T)