Java泛型是Java 5引入的一个新特性,它允许在编译时定义类型参数,使代码更加灵活和可重用。通过使用泛型,你可以编写一个类或方法,该类或方法可以处理多种数据类型,而不仅仅是特定的数据类型。
(1)类型安全:使用泛型,可以在编译时捕获类型错误,而不是在运行时。
(2)代码复用:通过使用泛型,可以编写适用于多种数据类型的代码,避免代码重复。
(3)灵活性:使用泛型,可以在运行时动态地指定类型,增加了代码的灵活性。
泛型类是使用<>这样的类型参数来声明的类,<>中T是一个通用的类型占位符。例如:
class Box<T> {
private T t;
public void set(T t) { this.t = t; }
public T get() { return t; }
}
public class Main() {
public static void main(String[] args) {
Box<Integer> box1 = new Box<>();
box1.set(12);
Box<String> box2 = new Box<>();
box2.set("abc");
}
}
在这个例子中,我们定义了一个名为Box的类,它使用一个类型参数T。这个类有一个私有的成员变量t,其类型为T。我们可以通过调用set()和get()方法来设置和获取t的值。
类名后的 <> 代表占位符,表示当前类是一个泛型类
了解: 【规范】类型形参一般使用一个大写字母表示,常用的名称有:
E 表示 Element
K 表示 Key
V 表示 Value
N 表示 Number
T 表示 Type
S, U, V 等等 - 第二、第三、第四个类型
泛型方法是在方法声明中使用类型参数的方法。例如:
public class GenericClass {
public <T> T genericMethod(T parameter) {
// 可以使用 T 类型的参数和返回值
return parameter;
}
}
在 Java 中,泛型在编译时会进行类型擦除,将类型参数替换为其边界类型(如Object)。这意味着在运行时无法获取具体的类型参数信息。
为了避免潜在的问题,Java 还提供了一些限制,例如不能在泛型类型上使用基本类型、不能创建泛型数组等。
在定义泛型类时,有时需要对传入的类型变量做一定的约束,可以通过类型边界来约束。
class 泛型类名称<类型形参 extends 类型边界> {
...
}
public class MyArray<E extends Number> {
...
}
只接受 Number 的子类型或本身作为 E 的类型实参
MyArray<Integer> l1; // 正常,因为 Integer 是 Number 的子类型
MyArray<String> l2; // 编译错误,因为 String 不是 Number 的子类型
了解: 没有指定类型边界 E,可以视为 E extends Object
到此,我们的 Java 泛型博客之旅就告一段落了。希望我的分享对你有所帮助。如果你有任何问题或想法,欢迎在评论中留言。让我们继续探索 Java 世界,共同成长!✌️