泛型的基本使用
-
泛型类: 你可以定义一个泛型类,其中包含一个或多个类型参数。这些类型参数用在类定义中,并且在创建该类的对象时指定具体的类型。
1public class Box<T> { 2 private T item; 3 4 public void set(T item) { 5 this.item = item; 6 } 7 8 public T get() { 9 return item; 10 } 11} 12 13// 使用泛型类 14Box<String> stringBox = new Box<>(); 15stringBox.set("Hello, World!"); 16String content = stringBox.get(); // 编译器自动类型检查
-
泛型方法: 你可以在不修改整个类的情况下定义泛型方法,这使得你可以在非泛型类中使用泛型功能。
1public class Utility { 2 public static <T> void swap(T[] array, int i, int j) { 3 T temp = array[i]; 4 array[i] = array[j]; 5 array[j] = temp; 6 } 7} 8 9// 使用泛型方法 10Integer[] numbers = {1, 2, 3}; 11Utility.swap(numbers, 0, 2); // 交换数组中的元素
-
泛型接口: 接口也可以是泛型的,这意味着它们可以被实现为特定的类型。
1public interface Stack<T> { 2 void push(T item); 3 T pop(); 4} 5 6// 实现泛型接口 7class SimpleStack<T> implements Stack<T> { 8 private List<T> items = new ArrayList<>(); 9 10 @Override 11 public void push(T item) { 12 items.add(item); 13 } 14 15 @Override 16 public T pop() { 17 if (items.isEmpty()) throw new EmptyStackException(); 18 return items.remove(items.size() - 1); 19 } 20}
泛型的限定
-
上界: 你可以限制类型参数只能接受某些特定类型的子类型。例如,使用
extends
关键字来指定上界。1public class UpperBound<T extends Number> { 2 private T item; 3 4 public void set(T item) { 5 this.item = item; 6 } 7 8 public T get() { 9 return item; 10 } 11}
-
下界: 你可以使用
super
关键字来指定下界,这通常用于写入数据的情况,比如集合。1public static <T> void printAll(List<? super T> list, T item) { 2 list.add(item); 3}
通配符
如果你不确定要使用的具体类型,或者希望增加灵活性,可以使用通配符(?
)。通配符可以用在参数列表中,表示任何类型。
1public static void printAll(List<?> list) {
2 for (Object obj : list) {
3 System.out.println(obj);
4 }
5}