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