Java 的泛型(Generics)是一种编程技术,它允许类、接口和方法在定义时使用参数化类型。通过泛型,可以编写更加通用和类型安全的代码。以下是 Java 泛型的一些关键知识点:
1. 泛型类(Generic Class)
- 定义泛型类时,使用尖括号
<>
来声明类型参数。例如:public class Box<T> { private T t; public void set(T t) { this.t = t; } public T get() { return t; } }
- 这里的
T
是一个类型参数,可以在实例化类时指定具体的类型。例如:Box<Integer> integerBox = new Box<>();
2. 泛型方法(Generic Method)
- 泛型方法可以在普通类中定义,使用类型参数来指定方法的参数或返回值类型。例如:
public <T> T genericMethod(T[] array) { return array[0]; }
- 调用时,编译器会根据传入的参数推断类型参数。
3. 泛型接口(Generic Interface)
- 泛型接口的定义与泛型类类似,可以包含类型参数。例如:
public interface Pair<K, V> { K getKey(); V getValue(); }
- 实现接口时可以指定具体的类型参数。
4. 类型参数的约束(Bounded Type Parameters)
- 可以使用
extends
关键字对类型参数进行约束,限制其必须是某个类或接口的子类型。例如:public class Box<T extends Number> { private T t; // ... }
- 这里的
T
必须是Number
或其子类,如Integer
、Double
等。
5. 通配符(Wildcards)
- 通配符
?
用于表示未知类型,常用于泛型方法的参数中。例如:public void printList(List<?> list) { for (Object elem : list) { System.out.println(elem); } }
- 通配符可以有上下界约束,如
<? extends T>
表示上限为T
,<? super T>
表示下限为T
。
6. 类型擦除(Type Erasure)
- Java 的泛型是编译时特性,编译后的字节码中类型参数会被擦除,替换为实际的类型(或
Object
),并在必要时插入类型转换代码。例如:Box<Integer> box = new Box<>(); box.set(123); Integer i = box.get();
- 编译后,类型参数
Integer
会被擦除,实际运行时类似如下代码:Box box = new Box(); box.set(123); Integer i = (Integer) box.get();
7. 泛型的限制
- 不能实例化类型参数,例如
new T()
是不允许的。 - 不能使用基本类型(如
int
)作为类型参数,必须使用包装类(如Integer
)。 - 不能创建泛型类型的数组,例如
new T[10]
是不允许的。
8. 泛型的多态性
- 泛型类和接口可以继承或实现其他泛型类或接口,从而形成泛型多态性。例如:
public class OrderedPair<K, V> implements Pair<K, V> { private K key; private V value; // ... }
总结
Java 泛型提供了强大的类型安全性和代码复用性。通过泛型,可以编写更加通用、类型安全的代码,减少类型转换和运行时错误。理解泛型的核心概念(如类型参数、约束、通配符和类型擦除)是掌握泛型编程的关键。
标签:Box,box,Java,类型,参数,泛型,public From: https://blog.csdn.net/2301_77006130/article/details/143480210