java1.5中增加了泛型。
1、声明中具有一个或多个参数类型的类或接口叫做泛型类或接口。泛型接口和类统称泛型。
2、每个泛型都有其对应的原生态类型(raw type),即不带任何参数类型。
3、泛型有子类型化规则:List<String>是List的子类型,而不是List<Object>的子类型。
下面用一段代码来验证一下该规则
public class Raw {
// Uses raw type (List) - fails at runtime! - Page 112
public static void main(String[] args) {
List<String> strings = new ArrayList<String>();
unsafeAdd(strings, new Integer(42));
String s = strings.get(0); // Compiler-generated cast
}
private static void unsafeAdd(List list, Object o) {
list.add(o);
}
// Use of raw type for unknown element type - don't do this! - Page 113
static int rawNumElementsInCommon(Set s1, Set s2) {
int result = 0;
for (Object o1 : s1)
if (s2.contains(o1))
result++;
return result;
}
// Unbounded wildcard type - typesafe and flexible - Page 113
static int numElementsInCommon(Set<?> s1, Set<?> s2) {
int result = 0;
for (Object o1 : s1)
if (s2.contains(o1))
result++;
return result;
}
}
程序有Warning,但能够运行。
如果把unsafeAdd()方法的第一个参数更改为List<Object>,那么就不能运行了。
4、无限制通配符’?‘,如:Set<?>.它表示Set的参数是一个确定的参数类型。要注意它与Set<Object>的区别。前者表示的只能是一种参数类型,只是先不能确定。而后者表示Set可以存任何类的对象。与原生态类型相比,通配符类型是安全的。
5、在类文字(类字面常量)中必须使用原生态类型。例:List.class可以,List<String>.class不可以。
6、在参数化类型并且是非无限通配符上使用instanceof操作符是非法的。无限通配符上是没影响的。