# Why Use Generics?

简单来说，泛型使得`types`（类和接口）可以在定义类，接口和函数时作为参数。和函数申明中使用熟悉的`formal`参数（形参）类似，类型参数提供了一种方式，使得不同的输入可以使用相关的代码。不同的是形参的输入是值，但是类型参数的输入是类型。

使用泛型的代表比起没有使用泛型的代码有以下这些优势：

* 编译时更强的类型检查

  Java编译器会在泛型代码上使用强类型检查，并在代码违反类型安全时报错。修复编译时异常比修复难以发现的运行时异常更加容易。
* 消除强类型转换（`casts`）

  以下没有泛型的代码片段需要强类型转换：

  ```java
  List list = new ArrayList();
  list.add("hello");
  String s = (String) list.get(0);
  ```

  使用泛型重写，可以避免类型转换：

  ```java
  List<String> list = new ArrayList<String>();
  list.add("hello");
  String s = list.get(0);   // no cast
  ```
* 使得开发者可以实现通用的算法

  通过使用泛型，开发者实现作用于不同类型集合的通用算法，这些算法可以是自定义的同时是类型安全并且易于阅读的。
