Java 泛型


Java 泛型

什么是泛型?

泛型是Java SE 5中引入的一个特性,它是指一个类或方法不仅能够具体地声明一个类型,而且也可以使用外来的类型来代替。

泛型的种类

Java 泛型可以分为以下三种种类:

泛型类

泛型类就是在声明类的时候使用泛型,从而使类中的方法、属性、参数可以接受同一种类型的数据。

public class GenericClass<T>{
    public T t;
    public <T> void genericMethod(T t){
        System.out.println(t.toString());
    }
}

泛型接口

泛型接口就是在声明接口的时候使用泛型,从而使接口中的参数、方法可以接受同一种类型的数据。

public interface GenericInterface<T>{
    public <T> void genericMethod(T t);
}

泛型方法

泛型方法就是在声明方法的时候使用泛型,从而使方法可以接受同一种类型的数据。

public class GenericMethod {
    public <T> void print(T t){
        System.out.println(t.toString());
    }
}

泛型的优点

使用泛型具有以下几个优点:

类型安全

使用泛型可以避免Java中的类型转换异常,从而保证了程序的安全性。

代码重用

使用泛型可以使方法、类、接口中的代码更加通用化,从而实现了代码的重用。

可读性强

使用泛型可以使代码更加简洁明了,从而提高了代码的可读性。

泛型通配符

Java中还提供了一种泛型通配符,用于表示任意类型的数据。

无限定通配符

无限定通配符用“?”表示,表示可以接受任意类型的数据。

public <T> void print(List<T> list){
    for (T t : list) {
        System.out.println(t.toString());
    }
}

上限通配符

上限通配符用“? extends”表示,表示只能接受指定类型及其子类的数据。

public static double sum(List<? extends Number> list){
    double sum = 0.0;
    for (Number number : list) {
        sum += number.doubleValue();
    }
    return sum;
}

下限通配符

下限通配符用“? super”表示,表示只能接受指定类型及其父类的数据。

public static <T> void addAll(List<? super T> dest, List<T> src){
    dest.addAll(src);
}

泛型的局限性

Java泛型也有一些局限性:

不能使用基本类型

Java泛型中不能使用基本类型,只能使用其对应的包装类。

运行时类型信息丢失

Java泛型中的类型信息只在编译期存在,编译后就被擦除掉了,不能在运行期获取类型信息。

总结

Java泛型是Java编程中重要的特性之一,它提供了更加安全、可读、重用的代码规范,同时也有一些局限性。需要在实际编码中灵活使用泛型,既要注意其优点,也要充分考虑其局限性。