一、泛型类的定义
Java泛型是Java SE 5中引入的一种泛化类型机制,能让代码变得更加通用,同时也更加类型安全。泛型不仅可用于方法中,还可以用来定义类。使用泛型类,可以在类中保持类型的一致性。
定义泛型类的格式如下:
public class 类名<类型参数列表> { // 类体 }
类名和类型参数之间用< 和 >表示类型参数列表,多个参数之间用逗号隔开。在类体中可以使用这些类型参数定义属性、方法及其他类元素。
下面是一个泛型类定义的示例:
public class Box<T> { private T t; public void set(T t) { this.t = t; } public T get() { return t; } }
以上代码中,Box是一个泛型类,<T>表示类型参数,任何符合Java命名规则的标识符都可以用作类型参数。
二、泛型类的使用
泛型类在使用时需要传入具体的类型参数。可以将任意类型作为类型参数,包括Java的内建类型,例如Integer、Double、String等。
示例如下:
Box<Integer> integerBox = new Box<>(); integerBox.set(10); System.out.println(integerBox.get());
以上代码中,类型参数指定为Integer,所以Box实例只能存储Integer类型的值。
三、泛型类的类型擦除
Java编译器在编译泛型类时,会将所有的类型参数替换成Object类型,这个过程被称为类型擦除。类型擦除是Java泛型的一种实现方式。
类型擦除后,泛型类中的类型变量都会被替换成其限定类型或者Object类型。例如:
public class Box<T extends Number> { private T t; public void set(T t) { this.t = t; } public T get() { return t; } }
以上代码中,<T extends Number>表示类型参数T必须是Number及其子类。经过类型擦除后,Box<T>被替换成Box。如果让Box<T>继承于Object,那么Box中所有的T都变成了Object。
四、泛型类的继承
泛型类可以像普通类一样继承其他类,并且自身可以具有类型参数。当子类继承父类时,可以保留泛型类型。例如:
class ParentBox<T> { ... } class ChildBox<T> extends ParentBox<T> { ... }
以上代码中,ChildBox将保留其父类ParentBox的泛型类型参数T。
五、泛型类的限定
可以使用extends关键字设置泛型类的类型参数的限制条件。限定参数可以是类、接口或类型变量。
示例如下:
public class Box<T extends Number> { ... }
六、泛型类的通配符
Java泛型中可以使用通配符代表一种未知类型,可以使用通配符限定参数类型范围,使其支持某个类或接口及其子类。
例如,可以使用Wildcard作为通配符,表示Box可以存储任何类型的对象:
public void process(Box<?> box) { ... }
以上代码中,?被用作通配符,表示该方法可以接受任意类型的Box实例作为参数。
七、总结
本文介绍了Java泛型类的定义和使用,包括泛型类的定义格式、类型擦除、继承、限定与通配符。使用泛型类能够让代码变得更加通用和类型安全。