有没有办法禁止参数化类型被特定类型参数化?
e.g。假设我想创建自己的专用List [T]类型,我不希望List [Nothing]合法,即导致编译错误。
我正在寻找一种方法来使以下错误更容易被捕获(是的,我知道这不是很有用或者很棒的Scala):
val x = ListBuffer()
x += 2
x的类型为ListBuffer [Nothing]。
答案 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中两种类型不相等是非常棘手的。请参阅先前的问题here和here。一种方法是建立一种情况,即相同的类型会导致模糊的含义。
答案 1 :(得分:2)
如果您特别想要避免Nothing,则可以定义类型A>:Null,因为Null是从底部开始的第二个并且也适用于所有类型(因此它的逆变包括除Nothing之外的所有类型)。
不确定这是多么有用,因为它的类型边界仍然包含Null。