注解
对泛型的限制
类型擦除
通配符
类型推断
类型推断和泛型方法
类型推断是Java编译器通过分析每个方法调用及其对应声明,来确定使该调用成立的类型实际参数的能力。推断算法会确定参数的类型,并在条件允许时确定结果被赋值或返回的类型。最后,推断算法会尝试找出能与所有参数兼容的最具体类型。
为说明最后一点,在下例中,推断机制判定传递给 pick 方法的第二个实参属于 Serializable 类型:
static <T> T pick(T a1, T a2) { return a2; }
Serializable s = pick("d", new ArrayList<String>());
泛型简介
将接口用作类型
将接口作为类型
定义新接口时,您实际上是在定义一种新的引用数据类型。接口名称可在任何可使用其他数据类型名称的位置使用。若定义类型为接口的引用变量,则赋值给该变量的任何对象都必须是实现该接口的类的实例。
例如,以下是一种在任意对象对中查找最大对象的方法,适用于从实现 Relatable 接口的类实例化的所有对象:
public Object findLargest(Object object1, Object object2) {
Relatable obj1 = (Relatable)object1;
Relatable obj2 = (Relatable)object2;
if ((obj1).isLargerThan(obj2) > 0)
return object1;
else
return object2;
}
实现一个接口
定义Relatable接口
要声明实现接口的类,需在类声明中包含一个 implements 子句。一个类可以实现多个接口,因此 implements 关键字后需跟随由逗号分隔的该类所实现接口的列表。按惯例,如果存在 extends 子句,则 implements 子句应紧随其后。
考虑一个定义如何比较对象大小的接口。
public interface Relatable {
// this (object calling isLargerThan())
// and other must be instances of
// the same class returns 1, 0, -1
// if this is greater than,
// equal to, or less than other
public int isLargerThan(Relatable other);
}
若需比较相似对象的大小(无论对象类型如何),则实例化这些对象的类应实现 Relatable 接口。