But you just said you _didn't_ know what type T was. That's why it's a parameter. Eventually you will know the type, but when you compile the case class code you don't know what it is.
If Scala used a templating mechanism like C++, instead of a generics mechanism like Java, this wouldn't matter: you'd generate the known-T-appropriate code at compile time. Downside: vast amounts of code is generated which all does basically the same thing. With generics, the decision of how to implement the details is deferred to runtime, and because of erasure it doesn't actually know what the type is any more. Downside: you need to give it something else to retain that information at runtime. Hence the ClassTag.
--Rex