泛型是编程中的一个重要概念,它在不同的编程语言里都有应用,像 Java、C# 等。下面以 Java 为例,为你详细介绍泛型。
泛型的定义
泛型,简单来说就是参数化类型。这意味着在定义类、接口或者方法时,把类型当作参数。这样在使用这些类、接口或方法时,就能明确指定具体的类型。
泛型的作用
- 类型安全:在编译阶段就可以发现类型不匹配的问题,避免运行时出现
ClassCastException
异常。 - 代码复用:编写的代码可以适用于多种数据类型,提高代码的复用性。
- 可读性增强:通过泛型可以明确指定使用的数据类型,让代码更易读和理解。
泛型在 Java 中的使用
泛型类
下面是一个简单的泛型类示例:
class Box<T> {
private T item;
public void setItem(T item) {
this.item = item;
}
public T getItem() {
return item;
}
}
在这个示例中,Box
类是一个泛型类,T
是类型参数。可以在创建 Box
对象时指定具体的类型:
Box<Integer> integerBox = new Box<>();
integerBox.setItem(10);
Integer item = integerBox.getItem();
泛型接口
泛型接口的定义和使用如下:
interface Generator<T> {
T generate();
}
class IntegerGenerator implements Generator<Integer> {
@Override
public Integer generate() {
return (int) (Math.random() * 100);
}
}
在这个示例中,Generator
是一个泛型接口,IntegerGenerator
类实现了该接口,并指定了具体的类型为 Integer
。
泛型方法
泛型方法可以在普通类或泛型类中定义:
class Util {
public static <T> boolean compare(T a, T b) {
return a.equals(b);
}
}
在这个示例中,compare
是一个泛型方法,<T>
表示这是一个泛型方法,T
是类型参数。可以这样调用泛型方法:
boolean result = Util.compare("hello", "hello");
泛型的通配符
在 Java 中,泛型还支持通配符,主要有以下三种:
? extends T
:表示上界通配符,即只能是T
或者T
的子类。? super T
:表示下界通配符,即只能是T
或者T
的父类。?
:表示无界通配符,即可以是任意类型。
以下是使用上界通配符的示例:
import java.util.ArrayList;
import java.util.List;
class Fruit {}
class Apple extends Fruit {}
public class GenericWildcardExample {
public static void printFruits(List<? extends Fruit> fruits) {
for (Fruit fruit : fruits) {
System.out.println(fruit);
}
}
public static void main(String[] args) {
List<Apple> apples = new ArrayList<>();
printFruits(apples);
}
}
在这个示例中,printFruits
方法接受一个 List
,该 List
中的元素类型必须是 Fruit
或者 Fruit
的子类。