Scala禁止特定类型的参数化

时间:2011-09-09 04:38:54

标签: scala

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

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

我正在寻找一种方法来使以下错误更容易被捕获(是的,我知道这不是很有用或者很棒的Scala):

val x = ListBuffer()
x += 2

x的类型为ListBuffer [Nothing]。

2 个答案:

答案 0 :(得分: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)

但是仍然可以将类型参数A显式设置为Nothing

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

更一般地说,确保Scala中两种类型不相等是非常棘手的。请参阅先前的问题herehere。一种方法是建立一种情况,即相同的类型会导致模糊的含义。

答案 1 :(得分:2)

如果您特别想要避免Nothing,则可以定义类型A>:Null,因为Null是从底部开始的第二个并且也适用于所有类型(因此它的逆变包括除Nothing之外的所有类型)。

不确定这是多么有用,因为它的类型边界仍然包含Null。