为引用类型传递null时Scala 2.7.x类型不匹配错误

时间:2009-12-10 21:23:46

标签: scala compiler-errors

以下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是一个类型参数而不是具体类型。在我更仔细地阅读卡尔的回答之前,我没有意识到这在原始问题上是模棱两可的。

4 个答案:

答案 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)