> For the complete documentation index, see [llms.txt](https://dreamylost.gitbook.io/question4scala/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://dreamylost.gitbook.io/question4scala/scala2/8.-specialized-zhu-jie-you-shi-mo-yong.md).

# @specialized注解有什么用？

⭐️⭐️⭐️⭐️⭐️

1. 用于特化泛型，避免装箱/拆箱以提升性能（不考虑Integer和int的内存差异），作用在泛型参数上，如：`class MyList[@specialized T]`
2. 本注解最终在编译期，会为所有primitive types的生成特化版本（此时泛型参数被移除，转而使用primitive types），`@specialized`还允许指定要特化的primitive types，如：`class MyList[@specialized(Int, Double, Boolean) T]`，此时仅为Int, Double, Boolean生成特化类。
3. 本质上`@specialized`是以空间换时间，需要注意的是，不带参数的`@specialized`注解默认会为所有primitive types生成特化版本（也就是下面的9个类型都会生成），所以字节码会增大数倍，通常，应该指定需要的primitive types，不要使用默认的。
4. 伴生对象Specializable中，对特化进行了分组，常见如下：

```
  // 注意，这个group这个是默认的！！！！生成9个特化类
  final val Primitives  = new Group((Byte, Short, Int, Long, Char, Float, Double, Boolean, Unit))
  final val Everything  = new Group((Byte, Short, Int, Long, Char, Float, Double, Boolean, Unit, AnyRef))
  final val Bits32AndUp = new Group((Int, Long, Float, Double))
  final val Integral    = new Group((Byte, Short, Int, Long, Char))
  final val AllNumeric  = new Group((Byte, Short, Int, Long, Char, Float, Double))
  final val BestOfBreed = new Group((Int, Double, Boolean, Unit, AnyRef))
```

答到1及格，答完满分
