Специализированный может быть дорогим ( экспоненциальный ) как по размеру классов, так и по времени компиляции.Это не просто размер, как говорит принятый ответ.
Откройте ваш scala REPL и введите его.
import scala.{specialized => sp}
trait S1[@sp A, @sp B, @sp C, @sp D] { def f(p1:A): Unit }
Извините :-).Это как бомба компилятора.
Теперь давайте возьмем простую черту
trait Foo[Int]{ }
Выше приведено два скомпилированных класса.Foo, чистый интерфейс и Foo $ 1, реализация класса.
Теперь,
trait Foo[@specialized A] { }
Специальный параметр шаблона здесь расширяется / переписывается для 9 различных примитивных типов (void, boolean, byte, char, int, long, short, double, float).Таким образом, в итоге вы получаете 20 классов вместо 2.
Возвращаясь к черте с 5 специализированными шаблонными параметрами, классы генерируются для каждой комбинации возможных примитивных типов.т.е. его экспоненциальная сложность.
2 * 10 ^ (без специализированных параметров)
Если вы определяете класс для конкретного примитивного типа, вы должны быть болеепрямо об этом, например,
trait Foo[@specialized(Int) A, @specialized(Int,Double) B] { }
Понятно, что при создании библиотек общего назначения нужно быть скромным, используя специализированные.
Здесь - это разглагольствование Пола Филлипса.