1. 泛型的概念与定义
-
什么是泛型:
泛型是Java提供的一种机制,允许我们定义类、接口和方法时使用类型参数。泛型的核心思想是让代码能够适应不同的数据类型,避免强制类型转换,从而提高代码的可维护性和安全性。
-
例如,我们在不使用泛型的情况下,集合类只能存储
Object
类型的对象,这意味着在获取元素时必须进行类型转换。而泛型让我们在编译时就可以指定具体的类型。
-
-
泛型的语法:
在类、方法或接口声明时,可以使用尖括号
<>
指定泛型类型参数。例如:public class Box<T> { private T item; public void setItem(T item) { this.item = item; } public T getItem() { return item; } }
在这个例子中,
Box
类使用了泛型类型T
,它可以是任何类型,如Integer
、String
等。
2. 泛型类与泛型方法
-
泛型类:
我们刚刚看到的
Box
类就是一个典型的泛型类。泛型类允许在创建对象时指定具体的类型,这样我们就不用每次都进行类型转换。-
示例代码:
Box<Integer> intBox = new Box<>(); intBox.setItem(123); System.out.println(intBox.getItem()); // 输出: 123 Box<String> strBox = new Box<>(); strBox.setItem("Hello"); System.out.println(strBox.getItem()); // 输出: Hello
-
使用泛型后,
intBox
只能存储Integer
类型的数据,strBox
只能存储String
类型的数据。
-
-
泛型方法:
泛型不仅可以应用于类,还可以应用于方法。在泛型方法中,类型参数可以放在方法的返回类型之前。
-
示例代码:
public <T> void printArray(T[] array) { for (T element : array) { System.out.println(element); } }
-
调用泛型方法时,编译器会根据传入的参数类型自动推断泛型类型。
String[] strArray = {"A", "B", "C"}; Integer[] intArray = {1, 2, 3}; printArray(strArray); // 输出: A, B, C printArray(intArray); // 输出: 1, 2, 3
-
3. 泛型在集合框架中的应用
泛型在Java的集合框架中应用非常广泛,几乎所有的集合类都使用了泛型。
-
List接口:List是一个典型的泛型集合类。
-
示例代码:
List<String> list = new ArrayList<>(); list.add("Java"); list.add("Generics"); for (String s : list) { System.out.println(s); }
-
在这里,
List<String>
表示该集合只能存储String
类型的元素,编译时如果试图插入其他类型的数据,会报错。
-
-
Map接口:
Map<K, V>
也是一个泛型类,K
代表键的类型,V
代表值的类型。-
示例代码:
Map<String, Integer> map = new HashMap<>(); map.put("Java", 1); map.put("Generics", 2); for (Map.Entry<String, Integer> entry : map.entrySet()) { System.out.println(entry.getKey() + ": " + entry.getValue()); }
-
这里,
Map<String, Integer>
表示键是String
类型,值是Integer
类型。
-
4. 类型通配符与边界限制
-
通配符?:
通配符
?
用于表示不确定的类型。例如,我们希望定义一个方法能够接收任何类型的集合,可以使用?
通配符。-
示例代码:
public void printList(List<?> list) { for (Object obj : list) { System.out.println(obj); } }
-
在这个例子中,
List<?>
表示可以接受任何类型的集合,而不需要指定具体的类型。
-
-
边界限制:
Java还提供了对泛型类型进行边界限制的功能。你可以通过
extends
和super
关键字来指定上限和下限。-
上限通配符:
<? extends T>
,表示泛型类型可以是T
或者T
的子类。-
示例代码:
public void process(List<? extends Number> list) { for (Number num : list) { System.out.println(num); } }
-
这里,
List<? extends Number>
表示集合中可以存储Number
类型或其子类(如Integer
、Double
)。
-
-
下限通配符:
<? super T>
,表示泛型类型可以是T
或者T
的父类。-
示例代码:
public void addNumber(List<? super Integer> list) { list.add(123); }
-
这里,
List<? super Integer>
表示集合中可以存储Integer
类型或其父类(如Number
、Object
)。
-
-