参数类型T有两种可能的状态

时间:2013-12-09 19:24:27

标签: scala generics

假设我们有一个方法

def foo[T](param: T): Array[String] = {
  //preform smth
}

我们如何确保T型为2种或多种可能的变体。例如,在我的特定情况下,我希望T为String或我的自定义类型Bar

2 个答案:

答案 0 :(得分:4)

请参阅"does Scala have type disjunction (union types)",特别是my answer。这种技术允许你写

def size[T : (Int |∨| String)#λ](t : T) = t match {
  case i : Int => i
  case s : String => s.length
}

答案 1 :(得分:0)

使用sealed trait并使两个/所有类型都继承自sealed trait。当然,这仅适用于您控制的类型,因此它不适用于String。此外,必须在与密封特征相同的文件中定义所有类型。

以下是一个例子:

sealed trait Tr
class Bar extends Tr
class Baz extends Tr

object Test {
  def foo(t: Tr): Array[String] = t match {
    case bar: Bar => Array("It's a bar")
    case baz: Baz => Array("It's a baz")
  }
}