Java泛型详解

46 阅读2分钟

Java泛型是Java 5中引入的一项重要特性,用于增强代码的类型安全性和可读性。泛型可以让我们编写更加通用、灵活的代码,并且可以在编译时检查类型正确性,避免运行时出现类型转换异常等问题。

定义方式:

Java泛型通过在类型、方法或类的声明中使用尖括号<>来声明泛型参数。例如:

public class MyClass<T> {
   //...
}

public <T> void myMethod(T t) {
    //...
}

List<String> myList = new ArrayList<String>();

在上面的示例中,MyClassmyMethodList都使用了泛型参数。其中,MyClass是一个泛型类,<T>表示声明了一个类型变量T,可以在类的内部使用这个变量。myMethod是一个泛型方法,同样使用了类型变量T,方法签名中的<T>表示该方法是一个泛型方法。List是Java集合框架中的一个接口,通过指定<String>类型参数来创建了一个只能存储字符串元素的列表。

使用方式:

使用泛型时,需要注意以下几点:

  1. 泛型参数只能是引用类型,不能是基本类型。
  2. 泛型参数在声明时不必指定其具体类型,而是在使用时再指定。
  3. 泛型参数可以有多个,用逗号隔开。
  4. 泛型参数的命名可以自定义,通常使用单个大写字母。
  5. 泛型通配符:表示不确定的类型,使用?表示,例如List<?> list = new ArrayList<>()表示一个未知元素类型的List。

以下是一些泛型的使用示例:

// 声明一个泛型类
public class Box<T> {
    private T t;

    public void set(T t) {
        this.t = t;
    }

    public T get() {
        return t;
    }
}

// 使用泛型类创建对象
Box<Integer> intBox = new Box<Integer>();
intBox.set(10);
int value = intBox.get();

// 声明一个泛型方法
public <T> void swap(List<T> list, int i, int j) {
    T temp = list.get(i);
    list.set(i, list.get(j));
    list.set(j, temp);
}

// 使用泛型方法
List<String> stringList = new ArrayList<>();
stringList.add("hello");
stringList.add("world");
swap(stringList, 0, 1);

// 声明一个泛型接口
public interface Pair<K, V> {
    K getKey();
    V getValue();
}

// 使用泛型接口实现类
public class StringPair implements Pair<String, String> {
    private String key;
    private String value;

    public StringPair(String key, String value) {
        this.key = key;
        this.value = value;
    }

    public String getKey() {
        return key;
    }

    public String getValue() {
        return value;
    }
}