2011-09-09 17 views
9

有沒有辦法禁止參數化類型被特定類型參數化?Scala禁止特定類型的參數化

例如假設我想創建我自己的專門的List [T]類型,我不希望List [Nothing]是合法的,即導致編譯錯誤。

我正在尋找一種方法,使下面的錯誤更容易趕上(是的,我明白這不是非常實用的或大的Scala):

val x = ListBuffer() 
x += 2 

x具有類型ListBuffer [沒什麼]。

回答

10

這種類型的作品,

class C[A](x: A*)(implicit ev: A =:= A) { } 

將會有一個類型的錯誤,如果A = Nothing推斷,

val c1 = new C[Int]() // Ok 
val c2 = new C(1)  // Ok, type `A = Int` inferred 
val c3 = new C()  // Type error, found (Nothing =:= Nothing) required: (A =:= A) 

但它仍然可以明確設置類型參數ANothing

val c4 = new C[Nothing]() // Ok 

更一般地說,它是pr狡猾的確保兩種類型在Scala中不相等。請參閱前面的問題herehere。一種方法是建立一個平等的類型會導致模棱兩可的暗示的情況。

+3

我不知道這樣的東西是否應該默認爲可變集合......這樣可以減少人們可以忘記的類型,但如果有必要的話,仍然沒有可用的東西。 – soc

2

如果你特別想避免Nothing,你可以定義一個類型A>:Null,因爲Null是從底部開始的第二個並且對所有類型都是協變的(因此它的逆變包括除Nothing之外的所有類型)。

不知道這是多麼有用,因爲它的類型邊界仍然包含Null。