您的位置:

Java泛型类的定义和使用

一、泛型类的定义

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泛型类的定义和使用,包括泛型类的定义格式、类型擦除、继承、限定与通配符。使用泛型类能够让代码变得更加通用和类型安全。