Java 泛型
Java 泛型
在本教程中,我们将通过示例了解 Java 泛型,如何创建泛型类和方法及其优势。
Java 泛型允许我们创建可用于不同类型数据(对象)的单个类、接口和方法。
这有助于我们重用我们的代码。
注意 :泛型 不适用于原始类型(int
, float
, char
等)。
Java 泛型类
我们可以创建一个可用于任何类型数据的类。这样的类称为泛型类。
下面是我们如何在 Java 中创建泛型类:
示例:创建泛型类
class Main {
public static void main(String[] args) {
// initialize generic class
// with Integer data
GenericsClass<Integer> intObj = new GenericsClass<>(5);
System.out.println("Generic Class returns: " + intObj.getData());
// initialize generic class
// with String data
GenericsClass<String> stringObj = new GenericsClass<>("Java Programming");
System.out.println("Generic Class returns: " + stringObj.getData());
}
}
// create a generics class
class GenericsClass<T> {
// variable of T type
private T data;
public GenericsClass(T data) {
this.data = data;
}
// method that return T type variable
public T getData() {
return this.data;
}
}
输出
Generic Class returns: 5 Generic Class returns: Java Programming
在上面的示例中,我们创建了一个名为 GenericsClass 的泛型类 .此类可用于处理任何类型的数据。
class GenericsClass<T> {...}
这里,T 在尖括号 <>
内使用 表示类型参数 . Main
内部 类,我们创建了 GenericsClass 的两个对象
- intObj - 这里,类型参数T 替换为
Integer
.现在,GenericsClass 适用于整数数据。 - 字符串对象 - 这里,类型参数T 替换为
String
.现在,GenericsClass 适用于字符串数据。
Java 泛型方法
与泛型类类似,我们也可以创建一个可用于任何类型数据的方法。这样的类称为泛型方法。
下面是我们如何在 Java 中创建泛型类:
示例:创建泛型方法
class Main {
public static void main(String[] args) {
// initialize the class with Integer data
DemoClass demo = new DemoClass();
// generics method working with String
demo.<String>genericsMethod("Java Programming");
// generics method working with integer
demo.<Integer>genericsMethod(25);
}
}
class DemoClass {
// creae a generics method
public <T> void genericsMethod(T data) {
System.out.println("Generics Method:");
System.out.println("Data Passed: " + data);
}
}
输出
Generics Method: Data Passed: Java Programming Generics Method: Data Passed: 25
在上面的示例中,我们创建了一个名为 genericsMethod 的泛型方法 .
public <T> void genericMethod(T data) {...}
这里,类型参数 <T>
在修饰符 public
之后插入 在返回类型 void
之前 .
我们可以通过放置实际类型<String>
来调用泛型方法 和 <Integer>
在方法名称前的括号内。
demo.<String>genericMethod("Java Programming");
demo.<Integer>genericMethod(25);
注意 :我们可以调用泛型方法而不包括类型参数。例如,
demo.genericsMethod("Java Programming");
在这种情况下,编译器可以根据传递给方法的值来匹配类型参数。
有界类型
一般来说,类型参数 可以接受任何数据类型(原始类型除外)。
但是,如果我们只想对某些特定类型使用泛型(例如接受数字类型的数据),那么我们可以使用有界类型。
对于绑定类型,我们使用 extends
关键词。例如,
<T extends A>
这意味着 T 只能接受 A 子类型的数据 .
示例:有界类型
class GenericsClass <T extends Number> {
public void display() {
System.out.println("This is a bounded type generics class.");
}
}
class Main {
public static void main(String[] args) {
// create an object of GenericsClass
GenericsClass<String> obj = new GenericsClass<>();
}
}
在上面的示例中,我们创建了一个名为 GenericsClass 的类。注意表情,注意表情
<T extends Number>
这里,GenericsClass 是用有界类型创建的。这意味着 GenericsClass 只能使用 Number
的子数据类型 (Integer
, Double
,等等)。
然而,我们用 String
创建了一个泛型类的对象 .在这种情况下,我们会得到以下错误。
GenericsClass<String> obj = new GenericsClass<>(); ^ reason: inference variable T has incompatible bounds equality constraints: String lower bounds: Number where T is a type-variable: T extends Number declared in class GenericsClass
Java 泛型的优点
1。代码可重用性
借助 Java 中的泛型,我们可以编写适用于不同类型数据的代码。例如,
public <T> void genericsMethod(T data) {...}
在这里,我们创建了一个泛型方法。同样的方法可用于对整数数据、字符串数据等进行操作。
2。编译时类型检查
类型参数 of generics 提供有关泛型代码中使用的数据类型的信息。例如,
// using Generics
GenericsClass<Integer> list = new GenericsClass<>();
在这里,我们知道 GenericsClass 正在使用 Integer
仅限数据。
现在,如果我们尝试将 Integer 以外的数据传递给这个类,程序会在编译时产生错误。
3。与集合一起使用
集合框架使用 Java 中的泛型概念。例如,
// creating a string type ArrayList
ArrayList<String> list1 = new ArrayList<>();
// creating a integer type ArrayList
ArrayList<Integer> list2 = new ArrayList<>();
在上面的例子中,我们使用了同一个 ArrayList 类来处理不同类型的数据。
类似于 ArrayList
, 其他集合 (LinkedList
, Queue
, Maps
, 等等) 在 Java 中也是泛型的。
java