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

Bla*_*ade 13 scala scala-2.9

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

case class Foo(a: Int)
Run Code Online (Sandbox Code Playgroud)

我期望Foo(1).asInstanceOf[Product1[Int]]工作,但它没有(使用Scala 2.9.1检查,并通过其他来源和Product文档确认).

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

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

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

Dan*_*ral 11

考虑一下:

case class X(n: Int)
case class Y(x: String, y: Int) extends X(y)
Run Code Online (Sandbox Code Playgroud)

如果case类扩展ProductN,然后,将延伸两个Product1Product2,但类型参数的变化,因此有两种不同的重载_1.这只是一个问题 - 我打赌还有其他问题.

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

  • 是的,希望这将使它成为未来的Scala版本,因为它允许人们编写案例类的类型安全的通用分解函数. (4认同)