我想在元组中对匹配项进行模式化,其中项具有相同的类型,包括类型参数。我的用例相当复杂,但我试图在这里提取一个最小的例子来说明问题:
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
答案 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
不变量上)。你可以(诚实地)对这对中的项目做的事情不多,因为你只知道他们有相同的类型,所以通常你会想要添加类似类约束的东西,并且使用方法也有助于这方面。