为什么我们需要Java中的泛型?
引用类型
众所周知,类是一个蓝图,其中定义了所需的行为和属性,并且接口类似于类,但它是一个Specification(包含抽象方法)。
与其他原始数据类型不同,这些类型也被视为Java中的数据类型,此类类型的文字指向/指向对象的位置。它们也称为引用类型。
泛型
泛型是Java中的一个概念,您可以在其中启用类,接口和方法,以接受所有(引用)类型作为参数。换句话说,该概念使用户能够动态选择方法(类的构造函数)接受的引用类型。
通过定义一个泛型类,可以使其成为类型安全的,即它可以作用于任何数据类型。为了理解泛型,让我们考虑一个例子-
示例
在下面的Java示例中,我们定义了一个名为Student的类,该类的构造函数(已参数化)接受一个Integer对象。在实例化此类时,您可以传递一个整数对象
class Student{ Integer age; Student(Integer age){ this.age = age; } public void display() { System.out.println("Value of age: "+this.age); } } public class GenericsExample { public static void main(String args[]) { Student std = new Student(25); std.display(); } }
输出结果
Value of age: 25
将任何其他对象传递给此类的构造函数都会生成编译时异常
public static void main(String args[]) { Student std = new Student("25"); std.display(); }
编译时错误
GenericsExample.java:12: error: incompatible types: String cannot be converted to Integer Student std = new Student("25"); ^ Note: Some messages have been simplified; recompile with -Xdiags:verbose to get full output 1 error
学生的年龄可以通过字符串值,浮点数,双精度数(的一个对象)进行传递。如果要传递另一个对象的值,则需要将构造函数更改为-
class Student{ String age; Student(String age){ this.age = age; } } Or, class Student{ Float age; Student(Float age){ this.age = age; } }
当您声明泛型类型时,它们可以作用于任何数据类型,并且它们被称为参数化类型。您不能在泛型中使用原始数据类型。
创建泛型类型
通过使用泛型参数T或GT创建泛型类型的类-
class Student <T>{ T obj; }
其中T(泛型参数)表示对象的数据类型,您可以将其传递给此类的构造函数。这将在编译时确定。
在实例化类时,您需要/可以选择泛型参数的类型为-
Student<Float> obj = new Student<Float>();
示例
我们可以使用泛型将上面的示例重写为-
class Student<T>{ T age; Student(T age){ this.age = age; } public void display() { System.out.println("Value of age: "+this.age); } } public class GenericsExample { public static void main(String args[]) { Student<Float> std = new Student<Float>(25.5f); std.display(); } }
输出结果
Value of age: 25.5
现在,在实例化Student类时,您可以将所需类型的对象作为参数传递为-
class Student<T>{ T age; Student(T age){ this.age = age; } public void display() { System.out.println("Value of age: "+this.age); } } public class GenericsExample { public static void main(String args[]) { Student<Float> std1 = new Student<Float>(25.5f); std1.display(); Student<String> std2 = new Student<String>("25"); std2.display(); Student<Integer> std3 = new Student<Integer>(25); std3.display(); } }
输出结果
Value of age: 25.5 Value of age: 25 Value of age: 25
为什么我们需要泛型
在代码中使用泛型将具有以下优点-
在编译时进行类型检查-通常,当您使用类型(常规对象)时,将不正确的对象作为参数传递时,它将在运行时提示错误。
而当您使用泛型时,错误将发生在编译时,这很容易解决。
代码重用-您可以使用泛型类型编写一次方法,类或接口,并且可以使用各种参数多次使用此代码。
对于某些类型,对于正式类型,您需要转换对象并使用。使用泛型(在大多数情况下),您可以直接传递所需类型的对象,而无需依赖转换。
使用泛型类型,您可以实现各种泛型算法。