理解Java泛型:类型安全问题案例
Java泛型是Java5引入的一个特性,它允许在编译时检查类型安全,从而避免在运行时出现类型转换错误。泛型的主要目的是提供编译时类型检查,以确保集合中的元素类型是正确的,并且可以避免类型转换。
泛型类型安全问题案例####1.非泛型集合在Java泛型出现之前,我们通常使用ArrayList
等集合来存储对象,但这些集合不提供类型安全检查。例如:
javaArrayList list = new ArrayList();
list.add("Hello");
String str = (String) list.get(0); //需要显式类型转换
如果不小心添加了错误类型的元素,比如:
javalist.add(123); //错误地添加了一个整数String str = (String) list.get(1); //运行时类型转换错误
这将导致ClassCastException
。
2.泛型集合使用泛型后,我们可以创建类型安全的集合:
javaArrayList<String> list = new ArrayList<>();
list.add("Hello");
String str = list.get(0); //无需类型转换
如果尝试添加错误类型的元素:
javalist.add(123); //编译错误:不能将int添加到String类型的ArrayList中
编译器会报错,因为ArrayList<String>
只能添加String
类型的对象。
3.泛型方法泛型也可以用于方法中,以确保方法的参数和返回值都是类型安全的:
javapublic <T> void printArray(T[] array) {
for (T item : array) {
System.out.println(item);
}
}
使用此方法时,可以传入任何类型的数组:
javaprintArray(new String[]{"Hello", "World"});
printArray(new Integer[]{1,2,3});
####4.泛型通配符有时我们需要处理不同类型的集合,但它们有共同的父类型。这时可以使用泛型通配符:
javapublic void printNumbers(List<? extends Number> numbers) {
for (Number number : numbers) {
System.out.println(number);
}
}
这个printNumbers
方法可以接受任何Number
的子类型的列表,如Integer
、Double
等。
还没有评论,来说两句吧...