2011-09-09 8 views
9

特定の型によってパラメータ化された型のパラメータ化を禁止する方法はありますか?特定の型のパラメータ化を禁止するスカラ

リスト[Nothing]が合法的でない、つまりコンパイルエラーが発生しないように、自分専用のList [T]型を作成したいとします。

私は(はい、私はこれは非常に機能や優れたスカラ座ではありません理解)キャッチする、次のエラーがより容易にする方法を探しています:

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) 

しかし、それは明示的Nothingに型パラメータAを設定することは可能ですされている場合、型エラーがあります、

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

さらに一般的には、 2つの型がScalaでは不等であることを保証するためには厄介です。前の質問herehereを参照してください。 1つのアプローチは、等しいタイプが曖昧な暗示につながる状況を設定することです。

+3

このようなものが変更可能なコレクションのデフォルトになっているのではないかと思っています。少ない人でタイプを忘れることができるようになりますが、必要な場合は何もありません。 – soc

2

Nothingが下から2番目であり、すべての型に対して共変もあるため(つまり、その反動にはNothing以外のすべての型が含まれているため)、特にNothingを避けたい場合は、A>:Nullを定義できます。

タイプの境界としての有用性がまだNullを含むかどうかはわかりません。

関連する問題