# 问题和练习：泛型

> 原文： [https://docs.oracle.com/javase/tutorial/java/generics/QandE/generics-questions.html](https://docs.oracle.com/javase/tutorial/java/generics/QandE/generics-questions.html)

1.  编写一个通用方法来计算集合中具有特定属性的元素数（例如，奇数整数，素数，回文数）。

2.  下面的类会编译吗？如果没有，为什么？

    ```
    public final class Algorithm {
        public static &lt;T&gt; T max(T x, T y) {
            return x &gt; y ? x : y;
        }
    }

    ```

3.  编写一个通用方法来交换数组中两个不同元素的位置。

4.  如果编译器在编译时擦除所有类型参数，为什么要使用泛型？

5.  类型擦除后，以下类转换为什么？

    ```
    public class Pair&lt;K, V&gt; {

        public Pair(K key, V value) {
            this.key = key;
            this.value = value;
        }

        public K getKey(); { return key; }
        public V getValue(); { return value; }

        public void setKey(K key)     { this.key = key; }
        public void setValue(V value) { this.value = value; }

        private K key;
        private V value;
    }

    ```

6.  在类型擦除后转换为以下方法是什么？

    ```
    public static &lt;T extends Comparable&lt;T&gt;&gt;
        int findFirstGreaterThan(T[] at, T elem) {
        // ...
    }

    ```

7.  以下方法会编译吗？如果没有，为什么？

    ```
    public static void print(List&lt;? extends Number&gt; list) {
        for (Number n : list)
            System.out.print(n + " ");
        System.out.println();
    }

    ```

8.  编写一个通用方法来查找列表 `[开始，结束]` 范围内的最大元素。

9.  下面的类会编译吗？如果没有，为什么？

    ```
    public class Singleton&lt;T&gt; {

        public static T getInstance() {
            if (instance == null)
                instance = new Singleton&lt;T&gt;();

            return instance;
        }

        private static T instance = null;
    }

    ```

10.  给出以下类：

    ```
    class Shape { /* ... */ }
    class Circle extends Shape { /* ... */ }
    class Rectangle extends Shape { /* ... */ }

    class Node&lt;T&gt; { /* ... */ }

    ```

    下面的代码会编译吗？如果没有，为什么？

    ```
    Node&lt;Circle&gt; nc = new Node&lt;&gt;();
    Node&lt;Shape&gt;  ns = nc;

    ```

11.  考虑这个类：

    ```
    class Node&lt;T&gt; implements Comparable&lt;T&gt; {
        public int compareTo(T obj) { /* ... */ }
        // ...
    }

    ```

    下面的代码会编译吗？如果没有，为什么？

    ```
    Node&lt;String&gt; node = new Node&lt;&gt;();
    Comparable&lt;String&gt; comp = node;

    ```

12.  如何调用以下方法来查找列表中的第一个整数，该整数是指定整数列表的相对素数？

    ```
    public static &lt;T&gt;
        int findFirst(List&lt;T&gt; list, int begin, int end, UnaryPredicate&lt;T&gt; p)

    ```

    注意，如果 gcd（ _a，b_ ）= 1，则两个整数 _a_ 和 _b_ 是相对素数，其中 gcd 是最大公约数的缩写。

[Check your answers.](generics-answers.html)