有沒有辦法禁止參數化類型被特定類型參數化?Scala禁止特定類型的參數化
例如假設我想創建我自己的專門的List [T]類型,我不希望List [Nothing]是合法的,即導致編譯錯誤。
我正在尋找一種方法,使下面的錯誤更容易趕上(是的,我明白這不是非常實用的或大的Scala):
val x = ListBuffer()
x += 2
x具有類型ListBuffer [沒什麼]。
有沒有辦法禁止參數化類型被特定類型參數化?Scala禁止特定類型的參數化
例如假設我想創建我自己的專門的List [T]類型,我不希望List [Nothing]是合法的,即導致編譯錯誤。
我正在尋找一種方法,使下面的錯誤更容易趕上(是的,我明白這不是非常實用的或大的Scala):
val x = ListBuffer()
x += 2
x具有類型ListBuffer [沒什麼]。
這種類型的作品,
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)
但它仍然可以明確設置類型參數A
到Nothing
,
val c4 = new C[Nothing]() // Ok
更一般地說,它是pr狡猾的確保兩種類型在Scala中不相等。請參閱前面的問題here和here。一種方法是建立一個平等的類型會導致模棱兩可的暗示的情況。
如果你特別想避免Nothing,你可以定義一個類型A>:Null,因爲Null是從底部開始的第二個並且對所有類型都是協變的(因此它的逆變包括除Nothing之外的所有類型)。
不知道這是多麼有用,因爲它的類型邊界仍然包含Null。
我不知道這樣的東西是否應該默認爲可變集合......這樣可以減少人們可以忘記的類型,但如果有必要的話,仍然沒有可用的東西。 – soc