这里的中括号就是类型参数化,也就是Java的泛型。只是Scala的类型系统较Java来说复杂很多,因此建议不要把Java往Scala这边套。
在您的这个例子中,类型参数ED被注解@specialized修饰,这是Scala的Type Specialization特性,本质上还是为了填Java假泛型和基本类型不属于Object的坑。由于Java中泛型被擦除成了Object,而Java的所有基本类型又不是Object,因此泛型使用基本类型时会被装箱(也就是只可以List而不能List的原因)。
Scala为了避免这个装箱和拆箱的开销,通过@specialized修饰的类型会被编译器特殊处理,在确定类型的情况下直接编译成对应JVM上的基本类型,也就是说编译器发现它实际是什么基本类型,就会编译一个对应类型的class版本出来。这样虽然会使字节码膨胀,但是可以减轻运行时的开销(本质上就和Java中为了提升性能,使用IntStream而不是Stream做计算一样,只是Scala在编译器层面提供了这一工具,不需要手动编写一个类似的class出来)。