原始类型是指使用泛型类型而没有指定类型参数。例如,List
是一个原始类型,而List<String>
是一个参数化类型。
当泛型在JDK 1.5中被介绍时,原始类型被保留仅仅是为了维持对老版本Java其向后兼容的特性。虽然原始类型仍然可以使用,但应该避免,原因如下:
- 它们通常要求类型转换(type cast);
- 它们不是类型安全的,一些重要的error仅会发生在运行时;
- 它们的表达性较差,相比于参数化类型,它们不能做到自描述(self-document)。
例子:
import java.util.*;
public final class AvoidRawTypes {
void withRawType() {
// Raw List doesn't self-document,
// doesn't state explicitly what it can contain
List stars = Arrays.asList("Arcturus", "Vega", "Altair");
Iterator iter = stars.iterator();
while(iter.hasNext()) {
String star = (String) iter.next(); // cast needed
log(star);
}
}
void withParameterizedType() {
List<String> stars = Arrays.asList("Spica", "Regulus", "Antares");
for(String star : stars) {
log(star);
}
}
private void log(Object message) {
System.out.println(Objects.toString(message));
}
}