2009-12-10 91 views
6

以下Scala代码无法在Scala 2.7.7中编译,在最后一行中发现类型不匹配错误“found:Null(null)required:T” :当为参考类型传递null时,Scala 2.7.x类型不匹配错误

/** 
* @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) 

我充分意识到空的邪恶的,但我只想说,我确实需要这样做。这是一个编译器错误或程序员错误?

编辑:只是为了澄清,T是一个类型参数,而不是一个具体类型。直到我更仔细地阅读卡尔的回答之前,我才意识到这在原始问题中是模棱两可的。

+2

FYI:使用REPL和Scala 2.7.5此代码工作在2.8 – 2009-12-10 21:40:10

回答

7

显然,correct way为此在2.7:

class Key[T] 

class Entry[T](val k: Key[T], val v: T) 

def makeEntry[T >: Null] = new Entry(new Key[T], null) 
1

你试过吗?

def makeEntry[T <: AnyRef] = new Entry[T](new Key[T], null: T) 
+1

同样的问题。 – paradigmatic 2009-12-10 22:20:54

+0

我没有意识到这是有效的语法。 :)试过了,它也不起作用。 – 2009-12-10 22:33:40

+0

我没有2.7的方便测试,但我也会尝试null.asInstanceOf [T] – 2009-12-10 22:49:16

4

这里的覆盖null定义:

类型为null是所有引用类型的子类型;它的唯一实例是空引用。由于Null不是值类型的子类型,因此null不是任何此类型的成员。例如,不可能将null分配给Int类型的变量。

在英语中,这表示您不能将null分配给值类型,但可以将其分配给任何引用类型。

我在计算T是一个值还是引用类型时遇到了一些问题;但那会回答你的问题。

由于您将T定义为AnyRef的子类型,我想这是一个ref,“错误”解释似乎更可能;特别是Mitch Blevins刚才说的代码在2.8以下。

+0

这似乎是共识,这应该工作,所以我会接受你的答案,除非有相反的证据出现。 – 2009-12-10 22:44:33

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]” 是必需的不知道,但它似乎是。

+0

在Scala中没有工作(我实际上无法使用该技术,因为Key和Entry实际上是在另一个库中定义的Java类) – 2009-12-10 22:39:47