为什么案例类只扩展Product而不扩展Product1,Product2,...,ProductN?

时间:2011-09-07 18:33:34

标签: scala scala-2.9

在我了解到案例类扩展了Product之后,我想知道他们为什么不扩展ProductN。例如,给出如下代码:

case class Foo(a: Int)

我希望Foo(1).asInstanceOf[Product1[Int]]可以正常工作,但它不会(使用Scala 2.9.1检查,并通过其他来源和Product文档确认)。

我对此感兴趣,因为我想声明如下的类:

abstract class UnaryOp[T1 <: Exp[_], R](t1: T1) extends Exp[R] {
  this: Product1[T1] =>
}

这样,一元操作的节点必须实现Product1。如果只是一个带有一个参数的case类就足够了。

3 个答案:

答案 0 :(得分:11)

考虑一下:

case class X(n: Int)
case class Y(x: String, y: Int) extends X(y)

如果案例类扩展ProductN,那么会扩展Product1Product2,但类型参数会更改,因此_1有两个不同的重载。这只是一个问题 - 我打赌还有其他问题。

现在,不推荐使用case类继承case类,而Martin Odersky正在考虑让它们继承ProductN。 AFAIK尚未完成,但障碍已被删除。

答案 1 :(得分:3)

马丁说我们可以做到之后不久就把它带回来了。它还没有正常工作,但就其而言,它在后备构建方面落后于X实验。

scala> case class Foo[T, U](x1: T, x2: U)
defined class Foo

scala> Foo(List("a"), "b")
res0: Foo[List[java.lang.String],java.lang.String] = Foo(List(a),b)

scala> res0.isInstanceOf[Product2[_,_]]
res1: Boolean = true

答案 2 :(得分:0)

如果Product1[Int]自动延长,则还必须提供val _1: Int。虽然我可以想象,可以自动将a分配给_1等等,但事实并非如此。可能只是为了让事情变得更加复杂。