在使用集合的时候,首先就会定义其泛型:
// 使用泛型 List,指定只能存储 String 类型的元素
List stringList = new ArrayList<>();
stringList.add("Hello");
stringList.add("World");
// 使用泛型后,编译器会保证类型的正确性
for (String str : stringList) {
System.out.println(str);
}
// 下面这行代码会导致编译错误,因为不能将Integer添加到String类型的List中,因为就和上面一样:Integer强制转换为String就报错
// stringList.add(10);
// 使用泛型,即使在需要类型转换时,也不会出现ClassCastException
// 因为编译器已经保证了类型的正确性
System.out.println(stringList.get(0));
可以看到,上面我们在定义List的时候就声明了泛型是String,这样在下面使用的时候,我们在编译代码的时候就能看到插入的类型是否会报错,就可以避免了运行时发生类型转换异常。
由此可见,使用泛型可以在编译时期捕捉到类型错误,而不是在运行时。根据越早出错代价越小原则,这有助于提高代码的可靠性和稳定性。