假设我有枚举
A
:
object A extends Enumeration { type A = Int; val A1 = 1; val A2 = 2; val A3 = 3 }
另外,我有一个仅为
A1
或 A2
定义的函数,但不为 A3
定义。
def foo(a: A): Int = a match {
case A.A1 => 1 // do something
case A.A2 => 2 // do something else
case A.A3 => throw new UnsupportedOperationException()
}
现在我想得到
foo(A.A3)
的编译错误。
在伪代码中,我像这样定义 foo
:
def foo(a: A1 | A2): Int = ???
您建议如何编写
foo
来防止使用 A.A3
调用它?
给出的伪代码是正确的;支持的类型需要位于
foo
的类型签名中,不支持的类型则不需要。
// Scala 3
object A extends Enumeration {
type A = Int
val A1 = 1
val A2 = 2
val A3 = 3
}
def foo(a: A.A1.type | A.A2.type): Int = 1
@main
def main(): Unit = {
foo(A.A1)
foo(A.A3)
}
编译错误:
Found: (A.A3 : Int)
Required: (A.A1 : Int) | (A.A2 : Int)
foo(A.A3)
如果你想在 scala 2 中执行此操作,你可能可以找到一些与幻像类型一起使用的东西。