当前位置:首页 > Java

java中如何使用泛型

2026-03-17 19:05:36Java

泛型的基本概念

泛型是Java中一种参数化类型的机制,允许在类、接口或方法中使用类型参数。泛型的主要目的是提高代码的重用性和类型安全性。

泛型类

定义一个泛型类时,需要在类名后面添加类型参数。类型参数可以是任何有效的标识符,通常使用大写字母如T、E、K、V等。

public class Box<T> {
    private T content;

    public void setContent(T content) {
        this.content = content;
    }

    public T getContent() {
        return content;
    }
}

使用泛型类时,需要指定具体的类型参数:

Box<String> stringBox = new Box<>();
stringBox.setContent("Hello");
String value = stringBox.getContent();

泛型方法

泛型方法可以在非泛型类中定义。泛型方法的类型参数声明在方法返回类型之前。

public <T> void printArray(T[] array) {
    for (T element : array) {
        System.out.println(element);
    }
}

调用泛型方法时,可以显式指定类型参数或让编译器自动推断:

Integer[] intArray = {1, 2, 3};
printArray(intArray); // 自动推断类型参数为Integer

类型通配符

类型通配符用于表示未知类型,通常用?表示。通配符可以用于参数、字段或局部变量的类型。

public void processList(List<?> list) {
    for (Object elem : list) {
        System.out.println(elem);
    }
}

有界类型参数

可以通过extends关键字限制类型参数的上界,或通过super关键字限制下界。

public <T extends Number> double sum(List<T> numbers) {
    double total = 0.0;
    for (T num : numbers) {
        total += num.doubleValue();
    }
    return total;
}

泛型接口

接口也可以使用泛型,定义方式与泛型类类似。

public interface Pair<K, V> {
    K getKey();
    V getValue();
}

实现泛型接口时,可以指定具体类型或保持泛型:

public class OrderedPair<K, V> implements Pair<K, V> {
    private K key;
    private V value;

    public OrderedPair(K key, V value) {
        this.key = key;
        this.value = value;
    }

    public K getKey() { return key; }
    public V getValue() { return value; }
}

类型擦除

Java的泛型是通过类型擦除实现的,编译器在编译时会移除所有类型参数信息。运行时无法获取泛型类型的具体信息。

List<String> stringList = new ArrayList<>();
List<Integer> intList = new ArrayList<>();
System.out.println(stringList.getClass() == intList.getClass()); // 输出true

泛型数组

由于类型擦除,Java不允许直接创建泛型数组。可以使用通配符类型或强制类型转换作为替代方案。

// 错误的写法
// List<String>[] arrayOfLists = new List<String>[10];

// 正确的替代方案
List<?>[] arrayOfLists = new List<?>[10];
arrayOfLists[0] = new ArrayList<String>();

泛型与继承

泛型类可以继承或扩展其他泛型类。子类可以保留父类的类型参数或指定具体类型。

java中如何使用泛型

public class ChildBox<T> extends Box<T> {
    // 子类保留父类的类型参数
}

public class StringBox extends Box<String> {
    // 子类指定具体类型参数
}

分享给朋友:

相关文章

如何配置java

如何配置java

安装Java开发工具包(JDK) 访问Oracle官方网站或OpenJDK项目页面下载适合操作系统的JDK安装包。选择与系统架构匹配的版本(如Windows x64、macOS ARM等)。运行安装程…

如何自学java

如何自学java

选择合适的学习资源 从官方文档开始,Oracle提供的Java官方教程(Java Tutorials)是权威且免费的学习资料。在线平台如Codecademy、Coursera或Udemy提供互动式课程…

java如何输入数组

java如何输入数组

输入数组的方法 在Java中,可以通过多种方式输入数组,具体取决于输入源(如控制台、文件等)和数组类型(如基本类型或对象类型)。以下是几种常见的方法: 使用Scanner从控制台输入 对于基本数据类…

java如何上传文件

java如何上传文件

使用HttpURLConnection上传文件 在Java中,可以通过HttpURLConnection实现文件上传功能。需要设置请求头为multipart/form-data,并构建包含文件数据的请…

java如何创建项目

java如何创建项目

使用IDE创建Java项目(以IntelliJ IDEA为例) 打开IntelliJ IDEA,选择“New Project”。 在左侧菜单中选择“Java”,确保已配置JDK(若无需手动添加)。 勾…

java如何生成随机数

java如何生成随机数

生成随机数的方法 在Java中生成随机数可以通过多种方式实现,以下是几种常见的方法: 使用Math.random()方法 Math.random()方法返回一个double类型的伪随机数,范围在[0…