# 定义简单泛型

> 原文： [https://docs.oracle.com/javase/tutorial/extra/generics/simple.html](https://docs.oracle.com/javase/tutorial/extra/generics/simple.html)

以下是包`java.util`中接口`List`和`Iterator`定义的一小段摘录：

```
public interface List <E> {
    void add(E x);
    Iterator<E> iterator();
}

public interface Iterator<E> {
    E next();
    boolean hasNext();
}

```

这个代码应该都很熟悉，除了尖括号中的东西。这些是接口`List`和`Iterator`的 _ 形式类型参数 _ 的声明。

类型参数可以在整个通用声明中使用，几乎可以使用普通类型（虽然有一些重要的限制;请参阅[精细打印](fineprint.html)部分。

在介绍中，我们看到了泛型类型声明`List`的 _ 调用 _，例如`List&lt;Integer&gt;`。在调用中（通常称为 _ 参数化类型 _），所有出现的形式类型参数（在这种情况下为`E`）都被 _ 实际类型参数 _ 替换（在这种情况下， `Integer`）。

你可以想象`List&lt;Integer&gt;`代表`List`的一个版本，其中`E`被`Integer`统一替换：

```
public interface IntegerList {
    void add(Integer x);
    Iterator<Integer> iterator();
}

```

这种直觉可能会有所帮助，但也会产生误导。

这很有用，因为参数化类型`List&lt;Integer&gt;`确实具有看起来像这种扩展的方法。

这是误导性的，因为泛型的声明从未以这种方式实际扩展。没有多个代码副本 - 不是源代码，不是二进制代码，不是磁盘而不是内存。如果您是 C ++程序员，您会明白这与 C ++模板非常不同。

泛型类型声明一次性编译，并转换为单个类文件，就像普通的类或接口声明一样。

类型参数类似于方法或构造函数中使用的普通参数。就像一个方法有 _ 形式值参数 _ 描述它操作的值的种类一样，泛型声明具有形式类型参数。当调用方法时，_ 实际参数 _ 将替换形式参数，并评估方法体。调用泛型声明时，实际的类型参数将替换形式类型参数。

关于命名约定的说明。我们建议您使用简洁（单个字符，如果可能）但令人回味的名称为正式类型参数。最好避免使用这些名称中的小写字符，这样可以很容易地将正式类型参数与普通类和接口区分开来。许多容器类型使用`E`作为元素，如上例所示。我们将在后面的示例中看到一些其他约定。