Java泛型类是指在定义类时使用泛型,以便把类的定义与使用分开,使得类可以接受不同的数据类型。泛型类的定义格式如下:
public class 类名<T> { // 类中的成员变量、方法 }
其中T表示一个占位符,代表任意一个未知的数据类型。当使用该泛型类时,需要在实例化对象时指定具体的数据类型,如:
MyClass<Integer> myClass = new MyClass<Integer>();
这样就表明myClass对象中所有引用T的地方都是Integer类型。Java泛型可以应用于方法、接口、类、枚举、数组、集合以及Lambda表达式。
Java泛型有三大优势:首先,它能够减少代码量,因为不需要写多余的代码来进行强制转换。其次,它能够避免出错,因为在使用前已将不合适的数据过滤了。最后,它能够带来性能上的优势,因为在运行时不需要进行强制转换。
Java泛型也有一些限制。首先,不能使用原始数据类型作为泛型参数。其次,不能创建参数化数组或者将参数化对象作为返回值或者作为方法参数传递。最后,不能对泛型对象执行instanceof 操作或者使用catch子句来处理异常。
使用泛型,我们可以在不知道代码操作对象的类型的情况下编写代码。它允许我们创建泛型类,构造函数和方法。
泛型类是使用形式类型参数定义的。
形式类型参数是一个逗号分隔的变量名列表,位于类声明中类名后面的尖括号<>中。
下面的代码声明一个类Wrapper,它接受一个形式类型参数:
public class Wrapper<T> { }
该参数已命名为T.
T是一个类型变量,它可以是Java中的任何引用类型,例如String,Integer,Double等。
当使用Wrapper类时,指定形式类型参数值。
采用形式类型参数的类也称为参数化类。
您可以声明Wrapper类的变量,将String类型指定为其形式类型参数的值,如下所示。
这里,String是实际的类型参数。
Wrapper<String> stringWrapper;
Java允许我们使用泛型类而不指定形式类型参数。
这是为了向后兼容。您还可以声明Wrapper<T>类的变量,如下所示:
Wrapper aRawWrapper;
当使用泛型类而不指定实际的类型参数时,它被称为原始类型。上面的声明使用Wrapper <T>类作为原始类型,因为它没有指定T的值。
泛型类的实际类型参数必须是引用类型。
原始类型不允许作为泛型类的实际类型参数。
类可以采用多个正式类型参数。下面的代码声明一个Mapper类,它接受两个形式参数T和R:
public class Mapper<T, R> { }
我们可以声明Mapper <T,R>类的变量如下:
Mapper<String, Integer> mapper;
这里,实际的类型参数是String和Integer。
形式类型参数在类体中可用作类型。
public class Wrapper<T> { private T obj; public Wrapper(T obj) { this.obj = obj; } public T get() { return obj; } public void set(T obj) { this.obj = obj; } }
Wrapper<T>类使用形式类型参数来声明实例变量obj,以声明其构造函数和set()方法的形式参数,以及作为get()方法的返回类型。
您可以通过为构造函数指定实际的类型参数来创建泛型类型的对象,如下所示:
Wrapper<String> w1 = new Wrapper<String>("Hello");
我们可以省略实际的类型参数。在下面的代码中,编译器会将构造函数的实际类型参数推断为String:
Wrapper<String> w1 = new Wrapper<>("Hello");
一旦你声明了泛型类的一个变量,你可以把形式类型参数看作是指定的实际类型参数。
现在,你可以认为,对于w1,Wrapper类的get()方法返回一个String。
String s1= w1.get();
以下代码显示如何使用Wrapper类。
public class Main { public static void main(String[] args) { Wrapper<String> w1 = new Wrapper<>("Hello"); String s1 = w1.get(); System.out.println("s1=" + s1); w1.set("Testing generics"); String s2 = w1.get(); System.out.println("s2=" + s2); w1.set(null); String s3 = w1.get(); System.out.println("s3=" + s3); } } class Wrapper<T> { private T obj; public Wrapper(T obj) { this.obj = obj; } public T get() { return obj; } public void set(T obj) { this.obj = obj; } }
Java面向对象设计 -Java对注释类型的限制注释类型的限制注释类型不能从另一个注释类型继承。每个注释类型都隐式地继承java.lang....
Java面向对象设计 -Java枚举类枚举类型的超类编译枚举类型时,编译器会创建一个类。枚举类型可以具有构造函数,字段和方法。枚举...
Java数据类型教程 - Java数据类型以下两行Java代码定义了两个整数:num1和num2:int num1;int num2;num1和num2是两个int变量。int...
JavaFX教程 -JavaFX TitledPane标题窗格是具有标题的面板,窗格可以打开和关闭。我们可以添加Node(如UI控件或图像)和一组元素到...