在Java中,泛型是一种参数化类型的概念,其可以在编译时期检测类型的合法性,并提供了类型安全性。泛型使得代码更具通用性,可重用性,且更加健壮。
泛型的定义和基本使用
泛型可以应用于类、接口和方法中。其定义格式如下:
class ClassName<T> {
//代码
}
interface InterfaceName<T> {
//代码
}
public <T> methodName(T obj) {
//代码
}
在上述定义中,<T>
表示类型参数,可以是任意字母,约定俗成的是T
表示Type的意思。
使用泛型时,我们可通过在尖括号内指定具体的类型参数,例如ClassName<Integer>
或InterfaceName<String>
。
泛型的优势
类型检查
使用泛型可以在编译时期检查类型的合法性,避免了在运行时出现类型转换异常的情况。这极大地提高了代码的可靠性和安全性。
List<String> list = new ArrayList<>();
list.add("Hello");
list.add(123); // 编译错误,只能添加String类型的元素
代码复用
使用泛型可以编写通用的代码,使得代码更加简洁和易于扩展。例如,可以编写一个通用的容器类,不需要为不同类型的对象编写不同的容器类。
class Container<T> {
private T element;
public void setElement(T element) {
this.element = element;
}
public T getElement() {
return element;
}
}
Container<String> container1 = new Container<>();
container1.setElement("Hello");
System.out.println(container1.getElement());
Container<Integer> container2 = new Container<>();
container2.setElement(123);
System.out.println(container2.getElement());
上述代码中,Container
类可以保存任意类型的对象。
提高性能
使用泛型可以避免不必要的类型转换,从而提高程序的性能。
在集合类中,使用泛型可以避免在获取元素时进行类型转换,从而提高集合的访问效率。
List<String> list = new ArrayList<>();
list.add("Hello");
String element = list.get(0); // 不需要进行类型转换
通配符
在使用泛型时,有时候需要扩展代码的通用性,这时可以使用通配符。通配符分为上界通配符和无界通配符。
上界通配符
上界通配符用于表示泛型参数的上界,使用extends
关键字来指定上界。
public void printList(List<? extends Number> list) {
for (Number n : list) {
System.out.println(n);
}
}
List<Integer> intList = new ArrayList<>();
intList.add(1);
intList.add(2);
printList(intList);
List<Double> doubleList = new ArrayList<>();
doubleList.add(1.5);
doubleList.add(2.5);
printList(doubleList);
上述代码中,printList
方法接受一个泛型类型的List,其中的元素必须是Number或其子类。这样,我们可以将List<Integer>
和List<Double>
作为参数传递给printList
方法。
无界通配符
无界通配符用于表示泛型参数没有上界,可以接受任意类型的参数。
public void printList(List<?> list) {
for (Object obj : list) {
System.out.println(obj);
}
}
List<String> strList = new ArrayList<>();
strList.add("Hello");
strList.add("World");
printList(strList);
List<Integer> intList = new ArrayList<>();
intList.add(1);
intList.add(2);
printList(intList);
上述代码中,printList
方法接受一个无界通配符类型的List,我们可以将任意类型的List作为参数传递给printList
方法。
泛型的局限性
在使用泛型时,有一些限制需要注意:
- 泛型类型参数不能是基本类型,只能是类类型或接口类型。
- 不能创建泛型类型的数组,例如
List<Integer>[] array = new List<Integer>[10];
是非法的。
总结
Java中的泛型是一种强大的特性,可以提高代码的类型安全性、代码复用性和性能。通过学习泛型的定义、使用和通配符的应用,我们可以更好地应用泛型来编写更加健壮和优雅的Java代码。
本文来自极简博客,作者:黑暗之影姬,转载请注明原文链接:Java中的泛型详解