15

在我了解到案例类扩展了 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。如果只是一个带有一个参数的案例类就足够了,那就太好了。

4

3 回答 3

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,尚未完成,但障碍已消除。

于 2011-09-08T01:25:35.233 回答
3

在马丁说我们可以做到后不久,我把它带回来了。它还不能正常工作,但在某种程度上,它在主干构建中落后于 -Xexperimental。

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
于 2011-09-08T20:32:23.307 回答
0

如果Product1[Int]会自动扩展,则val _1: Int也必须提供。尽管我可以想象,它可以自动a分配给_1etc 等,但事实并非如此。可能只是为了不让事情变得更复杂。

于 2011-09-07T19:04:12.473 回答