键入两个不相关类型的绑定

时间:2013-04-23 15:10:32

标签: scala

是否可以对Scala中的两个不相关类型进行限制? 例如,

trait A
trait B
def m(T <: A or B) ????

由于

1 个答案:

答案 0 :(得分:1)

如果您的AB完全不相关(例如,您不需要常用方法,否则您只能使用结构类型),这意味着当您将其用作方法参数时,仍然需要它实际上是什么类型才能使用它们。

在这种情况下,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感兴趣,因为它非常清楚地解释了什么。