范型(泛型)在Java中是一种在编码时不指定具体类型,而在使用时指定类型的编程方式。它允许编写更加通用、可重用的代码。在Java集合框架中,泛型被广泛使用。
为了理解泛型,我们可以通过比较没有泛型的代码和使用了泛型的代码来看看泛型是如何帮助我们写出更好的代码的。
没有使用泛型的例子:
List list = new ArrayList();
list.add("hello");
String s = (String) list.get(0); // 需要进行类型转换
在上面的代码中,List
是一个原始类型,它可以包含任何类型的对象。当你从这个列表中取出元素时,你需要进行类型转换,这不仅代码看起来不优雅,而且可能会导致运行时错误,如果列表中加入了非String
类型的对象。
使用泛型的例子:
List<String> list = new ArrayList<>();
list.add("hello");
String s = list.get(0); // 不需要进行类型转换
在这里,List<String>
是一个泛型类型的列表,它指定了列表中只能包含String
类型的对象。这样当你取出元素时就不需要进行类型转换,因为编译器已经知道列表中的内容是String
类型的。这样可以在编译时就发现类型不匹配的错误,避免了类型转换,使得代码更安全、更清晰。
泛型的好处:
-
类型安全:泛型提供了编译时的类型检查,如果你试图插入错误类型的对象,编译器会报错。
-
消除类型转换:你不再需要类型转换就能知道返回的对象类型。
-
提高代码重用:你可以写出更加通用的代码,这些代码可以工作在不同类型上。
泛型不仅仅可以用在集合中,还可以用在类定义、方法定义等多种场景。比如,你可以定义一个泛型类:
public class Box<T> {
private T t;
public void set(T t) {
this.t = t;
}
public T get() {
return t;
}
}
在这个Box
类的例子中,T
是一个类型参数,表示在使用Box
类的时候,你可以指定存储在其中的对象的类型。使用时可以这样:
Box<Integer> integerBox = new Box<>();
Box<String> stringBox = new Box<>();
这样,integerBox
只能存储Integer
类型的对象,而stringBox
只能存储String
类型的对象。