是否可以对Scala中的两个不相关类型进行限制? 例如,
trait A
trait B
def m(T <: A or B) ????
由于
答案 0 :(得分:1)
如果您的A
和B
完全不相关(例如,您不需要常用方法,否则您只能使用结构类型),这意味着当您将其用作方法参数时,仍然需要它实际上是什么类型才能使用它们。
在这种情况下,Either[A, B]正是您所需要的。它表示对象必须是A或B中的一个,并且您可以在Either类中使用模式匹配或其他方法来检查它们。
例如:
class MyClassA {
def methodA() = println("I'm A")
}
class MyClassB {
def methodB() = println("I'm B")
}
def m(a: Either[MyClassA, MyClassB]) {
a match {
case Left(a) => a.methodA()
case Right(b) => b.methodB()
}
}
m(Left(new MyClassA)) // OK
m(Right(new MyClassB)) // OK
m(Left(new MyClassB)) // Failed, a Left must be a MyClassB instance
您可能会对此article感兴趣,因为它非常清楚地解释了什么。