1.是什么
泛型(Generics)是Java 5中引入的一个特性,它提供了编译时类型安全检查的机制,允许在编码阶段指定集合的元素类型或者方法的参数类型。使用泛型可以增强程序的可读性和安全性,避免在运行时出现类型转换异常。
1. 泛型的定义
泛型是通过类型参数来实现的,这些类型参数在类、接口或方法的定义中使用一对尖括号(<>)指定。
2. 泛型的优点
- 类型安全:泛型可以保证在编译时期就能检查出非法的类型转换,而不是在运行时抛出
ClassCastException
。 - 消除强制类型转换:使用泛型后,可以减少代码中的类型转换操作,使得代码更加简洁。
- 代码复用:通过泛型,可以编写适用于多种数据类型的类或方法。
3. 泛型的使用示例
泛型类
public class Box<T> {
private T t; // T stands for "Type"
public void set(T t) {
this.t = t;
}
public T get() {
return t;
}
}
在这个例子中,Box
是一个泛型类,它有一个类型参数T
。这个T
可以在实例化Box
类的时候指定。
泛型方法
public class Util {
public static <K, V> boolean compare(Pair<K, V> p1, Pair<K, V> p2) {
return p1.getKey().equals(p2.getKey()) &&
p1.getValue().equals(p2.getValue());
}
}
public class Pair<K, V> {
private K key;
private V value;
public Pair(K key, V value) {
this.key = key;
this.value = value;
}
public K getKey() { return key; }
public V getValue() { return value; }
}
这里Util
类中的compare
方法是一个泛型方法,它接受两个Pair
类型的参数,并比较它们的键和值。
4. 泛型的类型限定
有时候,你可能希望限制泛型可以接受的类型。这可以通过类型限定来实现。
public class Plate<T extends Fruit> {
private T item;
public Plate(T item) {
this.item = item;
}
public void set(T item) {
this.item = item;
}
public T get() {
return item;
}
}
在这个例子中,Plate
类只能接受Fruit
类或其子类的实例。
5. 泛型的通配符
泛型的通配符?
用于表示未知类型,主要有三种使用方式:
<?>
无限定通配符<? extends T>
上限通配符<? super T>
下限通配符
public class Fruit {}
public class Apple extends Fruit {}
public class Test {
public static void main(String[] args) {
List<Apple> apples = new ArrayList<>();
List<Fruit> fruits = new ArrayList<>();
// 使用上限通配符
fruits.add(new Fruit());
apples.add(new Apple());
fruits = apples; // 编译错误,因为List<Apple>不是List<Fruit>的子类型
fruits = new ArrayList<Fruit>(); // 正确
// 使用下限通配符
List<? super Apple> list = new ArrayList<Fruit>();
list.add(new Apple()); // 正确
// list.add(new Fruit()); // 编译错误,因为Fruit不是Apple的父类
}
}
泛型是Java语言中一个强大而灵活的特性,合理使用泛型可以使代码更加健壮和易于维护。
标签:通配符,public,item,理解,泛型,new,class From: https://blog.csdn.net/2401_83418369/article/details/142320018