После того, как я узнал, что тематические классы расширяют 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 с одним параметром.