在我了解到案例类扩展了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类就足够了。
答案 0 :(得分:11)
考虑一下:
case class X(n: Int)
case class Y(x: String, y: Int) extends X(y)
如果案例类扩展ProductN
,那么会扩展Product1
和Product2
,但类型参数会更改,因此_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
等等,但事实并非如此。可能只是为了让事情变得更加复杂。