Scala模式多次匹配相同的类型参数

时间:2014-04-03 13:19:47

标签: scala types pattern-matching

我想在元组中对匹配项进行模式化,其中项具有相同的类型,包括类型参数。我的用例相当复杂,但我试图在这里提取一个最小的例子来说明问题:

class Foo[T] { }

val input = ( new Foo[String], new Foo[String] )

input match {
  case (a:Foo[x], b:Foo[x]) =>
    // Do things that rely on a and b having exactly the same type
}

但这不能编译,因为我在case语句中使用x两次。编译提供以下错误:

error: x is already defined as type x

我尝试更改匹配以为两个输入提取不同的类型参数,然后测试它们的相等性:

input match {
  case (a:Foo[x], b:Foo[y]) if (x == y) =>
    // Do things that rely on a and b having exactly the same type
}

但是这不会编译,给出错误

error: not found: value x

是否有一些Scala语法可以用来匹配两个具有相同,未指定类型的东西?我正在运行Scala 2.9.2

1 个答案:

答案 0 :(得分:1)

在模式匹配中使用类型或类型变量时,您应该三思而后行,首先因为类型擦除意味着它不可能工作,其次因为参数化意味着它不应该。这几乎总是一个更好的解决方案。

在这种情况下,您可以执行以下操作:

class Foo[T] { }

val input = (new Foo[String], new Foo[String])

def doSomething[A](pair: (Foo[A], Foo[A])) = ???

现在doSomething(input)会编译,但doSomething((new Foo[Char], new Foo[Int]))赢了(假设您将类型参数保留在Foo不变量上)。你可以(诚实地)对这对中的项目做的事情不多,因为你只知道他们有相同的类型,所以通常你会想要添加类似类约束的东西,并且使用方法也有助于这方面。