Given:



public class Foo<K, V> {

    private K key;
    private V value;

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

    public static <T> Foo<T, T> twice(T value) {
        return new Foo<T, T>(value, value);
    }

    public K getKey() {
        return key;
    }

    public V getValue() {
        return value;
    }
}

Which option fails?

A.

Foo<String, Integer> mark = new Foo<String, Integer> ("Steve", 100);

B.

Foo<String, String> pair = Foo.<String>twice ("Hello World!");

C.

Foo<?, ?> percentage = new Foo<?, ?>(97, 32);

D.

Foo<String, String> grade = new Foo<>("John", "A");

題解

選項A,雖然是正確的泛型使用方式,但是在Java 7以後的版本,在實體化物件的時候,最好是省略new運算子泛型的型態,變成以下這樣:

Foo<String, Integer> mark = new Foo<> ("Steve", 100);

選項B,正確的泛型使用方式。

選項C,錯誤的泛型使用方式,「?」代表未知型態。應改成以下這樣:

Foo<?, ?> percentage = new Foo<>(97, 32);

或是指定明確的類別型態:

Foo<?, ?> percentage = new Foo<Integer, Integer>(97, 32);

選項D,正確的泛型使用方式。