泛型
- 泛型是一种在编译时期进行类型检查和类型安全的机制,它允许类、接口和方法在定义时使用一个或多个类型参数
- 边界:使用边界来限制泛型类型。例如, 表示类型 T 必须是 Number 或其子类。
- 类型擦除:Java中的泛型是通过类型擦除实现的,这意味着在编译时会将泛型类型擦除为原始类型。这样做是为了保持向后兼容性。
- 泛型限制:Java中的泛型不支持基本类型(int、char 等),只支持引用类型。
- 泛型和继承:泛型类之间的继承关系与非泛型类类似,但泛型类的类型参数必须匹配。例如,List 不是 List 的子类。
- 泛型擦除和桥方法:在泛型类中,编译器会生成桥方法来处理类型擦除。这些桥方法用于保持多态性。
- 泛型和数组:不能创建参数化类型的数组,例如 List[] array = new List[10]; 是非法的。这是因为 Java 中的数组具有固定的类型。
- 泛型和反射:由于类型擦除,泛型信息在运行时不可用。因此,在使用反射时,无法直接获取泛型类型信息。
- 泛型同样的也可以看作是一个变量,只是,它变的不是数值,而是数据类型
泛型类
- 泛型类:该类具有一个或多个类型参数,例如 class MyClass { … }。在类的定义中,您可以使用这些类型参数来定义类的字段、方法参数和返回类型。
// 定义一个泛型类
class Box<T> {
private T value;
public void set(T value) {
this.value = value;
}
public T get() {
return value;
}
}
public class Main {
public static void main(String[] args) {
// 创建一个存储整数的Box对象
Box<Integer> integerBox = new Box<>();
integerBox.set(10);
System.out.println("Integer Value: " + integerBox.get());
// 创建一个存储字符串的Box对象
Box<String> stringBox = new Box<>();
stringBox.set("Hello, Generics!");
System.out.println("String Value: " + stringBox.get());
}
}
泛型方法
- 泛型方法:可以在方法声明中使用类型参数,例如 public T myMethod(T value) { … }。这使得方法可以独立于类使用泛型。
// 定义一个泛型方法
public <T> void printArray(T[] array) {
for (T element : array) {
System.out.print(element + " ");
}
System.out.println();
}
// 使用泛型方法
Integer[] intArray = {1, 2, 3, 4, 5};
String[] strArray = {"Java", "Generics", "Example"};
System.out.print("Integer Array: ");
printArray(intArray);
System.out.print("String Array: ");
printArray(strArray);
通配符
- 通配符:Java中的通配符用于表示未知类型。? 是通配符的基本形式。通配符可以用作泛型方法的参数,以增加灵活性。
// 定义一个泛型方法,使用通配符
public void displayList(List<?> list) {
for (Object element : list) {
System.out.print(element + " ");
}
System.out.println();
}
// 使用通配符
List<Integer> intList = Arrays.asList(1, 2, 3, 4, 5);
List<String> strList = Arrays.asList("Java", "Generics", "Example");
System.out.print("Integer List: ");
displayList(intList);
System.out.print("String List: ");
displayList(strList);