Scala禁止特定类型的参数化

Pan*_*Lee 9 scala

有没有办法禁止参数化类型被特定类型参数化?

例如假设我想创建自己的专用List [T]类型,我不希望List [Nothing]合法,即导致编译错误.

我正在寻找一种方法来使以下错误更容易被捕获(是的,我知道这不是非常实用或伟大的Scala):

val x = ListBuffer()
x += 2
Run Code Online (Sandbox Code Playgroud)

x的类型为ListBuffer [Nothing].

Kip*_*ros 10

这种作品,

class C[A](x: A*)(implicit ev: A =:= A) { }
Run Code Online (Sandbox Code Playgroud)

如果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)
Run Code Online (Sandbox Code Playgroud)

但是仍然可以将类型参数显式设置ANothing,

val c4 = new C[Nothing]() // Ok
Run Code Online (Sandbox Code Playgroud)

更一般地说,确保Scala中两种类型不相等是非常棘手的.在此处此处查看先前的问题.一种方法是建立一种情况,即相同的类型会导致含糊不清的含义.

  • 我想知道这样的东西是否应该是可变集合的默认值...这样可以让更少的人忘记这种类型,但如果有必要,仍然没有任何东西可用. (3认同)