2009-12-10 89 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