Typically, you can't use a 'new' operator on a generic type. This is because of type erasure.
scala> def create[T] = new T <console>:7: error: class type required but T found def create[T] = new T ^
Scala gives a way of getting around this problem, with the
scala> def create[T](implicit m:Manifest[T]) = m.erasure.newInstance create: [T](implicit m: Manifest[T])Any scala> create[String] res0: Any = "" scala> class SomeClass defined class SomeClass scala> create[SomeClass] res1: Any = SomeClass@112356a
Manifest object passed by the compiler has the details of the generic at runtime. Using a bit more syntactic sugar,
create can be rewritten as,
scala> def create[T:Manifest] = manifest[T].erasure.newInstance create: [T](implicit evidence$1: Manifest[T])Any
This feature is useful in other cases also, like, getting the type of objects in a
List at runtime.
scala> def processList[E : Manifest](ls : List[E]) = println(manifest[E].erasure) processList: [E](ls: List[E])(implicit evidence$1: Manifest[E])Unit scala> processList(List(1, 3, 5, 7)) int scala> processList(List("A", "S", "D", "F")) class java.lang.String