📅  最后修改于: 2023-12-03 15:16:36.074000             🧑  作者: Mango
Java泛型是一种通用编程概念,目的是通过参数化类型来增加代码的重用和类型安全。 一个类或接口,参数使用<>括起来,在Java中被称为泛型类或泛型接口。
泛型使得类和接口可以具有操作各种对象类型的能力,同时还可以提供类型检查和类型安全检查。
泛型类定义一个类,其中至少一个方法使用泛型类型参数。
语法:
class className<T> {
// variables, constructors, methods
}
这里 <T>
表示类型参数,T 可以替换为任何类型,例如 Integer、String 等。
泛型类可以包含泛型方法和非泛型方法。
下面是一个泛型类的示例,其中 T 表示类型参数。
class MyClass<T> {
private T myVar;
public MyClass(T myVar) {
this.myVar = myVar;
}
public void setMyVar(T myVar) {
this.myVar = myVar;
}
public T getMyVar() {
return myVar;
}
}
这个类有一个泛型类型参数 T,它有一个构造函数和两个方法。构造函数使用 T 类型的参数,另外两个方法也使用 T 类型的参数。其中 setMyVar
方法用于设置 myVar 属性,getMyVar
方法用于获取 myVar 属性。这个类可以用来存储任何类型的数据。
使用泛型类时,必须在实例化的时候指定类型参数。
示例代码:
MyClass<Integer> myObj = new MyClass<Integer>(42);
int myNum = myObj.getMyVar();
这里,MyClass<Integer>
表示实例化一个类型为 Integer
的泛型类。myObj
是这个类的一个实例,它的 myVar
属性被赋值为 42。myNum
是一个 int 变量,它的值被设置为 myObj
的 myVar
属性。因为类型参数被指定为 Integer
,所以可以直接赋值给 int 类型。
在泛型类定义中,可以使用类型边界(type boundaries)来限制参数的类型。类型边界可以是类、接口或类和接口的组合。
语法:
class className<T extends someClass> {
// variables, constructors, methods
}
这里<T extends someClass>
表示类型参数 T 必须是 someClass 类的子类(包括 someClass 本身)。
下面是一个泛型类的示例,其中使用类型边界限制泛型参数的类型。
class ArrayUtility<T extends Number> {
private T[] array;
public ArrayUtility(T[] array) {
this.array = array;
}
public T getMaxValue() {
T max = array[0];
for (int i = 1; i < array.length; i++) {
if (array[i].doubleValue() > max.doubleValue()) {
max = array[i];
}
}
return max;
}
}
这个类有一个泛型类型参数 T,它继承 Number 类。这意味着 T 必须是 Number 类或其子类的类型。该类有一个构造函数和一个方法,方法返回数组中最大的元素。
使用类型边界的泛型类,必须保证传入的参数类型符合其的边界限制。示例代码:
Integer[] numbers = {1, 2, 3};
ArrayUtility<Integer> util = new ArrayUtility<Integer>(numbers);
Integer max = util.getMaxValue();
这里,ArrayUtility<Integer>
表示以 Integer 类型为边界的泛型类,util
是这个类的一个实例。传入的数组类型必须是 Number 或其子类的类型。
本文介绍了 Java 泛型类的概念以及如何使用泛型类和类型边界。通过使用泛型类和类型边界,可以提高代码的重用性和类型安全性。