Теперь есть правильный и безопасный способ сделать это. В Scala 2.10 введены TypeTags, которые фактически позволяют нам преодолеть проблему стирания при использовании универсальных типов.
Теперь можно параметризировать ваш класс следующим образом:
class BalanceActor[T <: Actor :ClassTag](fac: () => T) extends Actor {
val actors = Array.fill[T](10)(fac())
}
Делая это, мы требуем, чтобы неявный ClassTag [T] был доступен при создании экземпляра класса. Компилятор обеспечит это и сгенерирует код, который передает ClassTag [T] в конструктор класса. ClassTag [T] будет содержать всю информацию о типе T, и в результате этого та же информация, которая доступна компилятору во время компиляции (перед стиранием), теперь будет также доступна во время выполнения, что позволит нам построить Массив [T].
Обратите внимание, что это все еще невозможно сделать:
class BalanceActor[T <: Actor :ClassTag] extends Actor {
val actors = Array.fill[T](10)(new T())
}
Причина, по которой это не работает, заключается в том, что у компилятора нет возможности узнать, есть ли у класса T конструктор без аргументов.