Type Parameter and Type Argument Terminology:许多开发者会混淆术语type parameter(类型参数)和type argument(类型传参),但是它们是不同的。在编程时,提供type argument是为了创建一个参数化的类型,因此Foo<T>中的T就是type parameter,而Foo<String> f中的String就是type argument,本文遵循此定义。
与其他的变量声明一样,这段代码不会真的创建一个新的Box对象。它只是声明integerBox持有一个Box of Integer的引用,这就是读取Box<Integer>的方式。
调用泛型类型也被称为parameterized type(参数化类型)
为了实例化对象,我们通常使用new关键字,在类名和圆括号之间添加<Integer>:
The Diamond
在Java SE 7和以后版本,只要编译器能从上下文中确定或者推断出类型参数,就可以使用一组空的类型参数<>来替换掉用泛型类的构造函数所需的类型参数。这对尖括号<>,被称为the diamond(菱形运算符)。例如,你可以用下面这条语句创建一个Box<Integer>实例:
/**
* Generic version of the Box class.
* @param <T> the type of the value being boxed
*/
public class Box<T> {
// T stands for "Type"
private T t;
public void set(T t) { this.t = t; }
public T get() { return t; }
}
Box<Integer> integerBox;
Box<Integer> integerBox = new Box<Integer>();
Box<Integer> integerBox = new Box<>();
public interface Pair<K, V> {
public K getKey();
public V getValue();
}
public class OrderedPair<K, V> implements Pair<K, V> {
private K key;
private V value;
public OrderedPair(K key, V value) {
this.key = key;
this.value = value;
}
public K getKey() { return key; }
public V getValue() { return value; }
}
Pair<String, Integer> p1 = new OrderedPair<String, Integer>("Even", 8);
Pair<String, String> p2 = new OrderedPair<String, String>("hello", "world");
OrderedPair<String, Integer> p1 = new OrderedPair<>("Even", 8);
OrderedPair<String, String> p2 = new OrderedPair<>("hello", "world");
OrderedPair<String, Box<Integer>> p = new OrderedPair<>("primes", new Box<Integer>(...));