Java之泛型使用教程

简介: Java之泛型使用教程

泛型是 Java 中一项重要的特性,它允许在定义类、接口和方法时使用类型参数,从而实现代码的复用和类型安全。下面是关于 Java 泛型的使用教程:

一、泛型的基本概念

泛型(Generics)的核心思想是将类型参数化,即在定义类、接口或方法时不指定具体类型,而是在使用时再指定。这样可以:

  1. 提高代码复用性
  2. 保证类型安全,避免 ClassCastException
  3. 减少类型转换操作

二、泛型类

泛型类是在类定义时使用类型参数的类。

语法:

class 类名<T> {
   
    // 可以使用T作为类型
    private T value;

    public T getValue() {
   
        return value;
    }

    public void setValue(T value) {
   
        this.value = value;
    }
}

示例:

// 定义泛型类
class Box<T> {
   
    private T content;

    public T getContent() {
   
        return content;
    }

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

// 使用泛型类
public class Main {
   
    public static void main(String[] args) {
   
        // 创建存储String类型的Box
        Box<String> stringBox = new Box<>();
        stringBox.setContent("Hello Generics");
        String str = stringBox.getContent(); // 无需类型转换

        // 创建存储Integer类型的Box
        Box<Integer> intBox = new Box<>();
        intBox.setContent(123);
        int num = intBox.getContent();
    }
}

三、泛型接口

泛型接口与泛型类类似,在接口定义时指定类型参数。

语法:

interface 接口名<T> {
   
    T method();
}

示例:

// 定义泛型接口
interface Generator<T> {
   
    T generate();
}

// 实现泛型接口
class NumberGenerator implements Generator<Integer> {
   
    @Override
    public Integer generate() {
   
        return (int)(Math.random() * 100);
    }
}

四、泛型方法

泛型方法是在方法定义时声明类型参数的方法,它可以在普通类或泛型类中定义。

语法:

修饰符 <T> 返回值类型 方法名(参数列表) {
   
    // 方法体
}

示例:

public class GenericMethodExample {
   
    // 泛型方法
    public static <T> void printArray(T[] array) {
   
        for (T element : array) {
   
            System.out.print(element + " ");
        }
        System.out.println();
    }

    public static void main(String[] args) {
   
        Integer[] intArray = {
   1, 2, 3, 4, 5};
        String[] stringArray = {
   "Hello", "World", "Generics"};

        printArray(intArray);   // 自动推断类型为Integer
        printArray(stringArray); // 自动推断类型为String
    }
}

五、泛型通配符

泛型通配符用于表示未知类型,主要有三种形式:

  1. ?:表示任意类型
  2. ? extends T:表示T类型或T的子类型(上界限定)
  3. ? super T:表示T类型或T的父类型(下界限定)

示例:

public class WildcardExample {
   
    // 只能读取,不能写入
    public static void printList(List<? extends Number> list) {
   
        for (Number n : list) {
   
            System.out.print(n + " ");
        }
        System.out.println();
    }

    // 可以写入T类型及其子类型
    public static void addNumbers(List<? super Integer> list) {
   
        for (int i = 1; i <= 5; i++) {
   
            list.add(i);
        }
    }

    public static void main(String[] args) {
   
        List<Integer> intList = new ArrayList<>();
        List<Double> doubleList = new ArrayList<>();
        List<Object> objList = new ArrayList<>();

        printList(intList);    // 合法
        printList(doubleList); // 合法

        addNumbers(intList);   // 合法
        addNumbers(objList);   // 合法
    }
}

六、泛型的限制

  1. 不能使用基本类型作为类型参数,必须使用包装类
  2. 泛型类型参数不能用于静态成员
  3. 不能实例化泛型类型的对象
  4. 不能使用 instanceof 检查泛型类型

七、泛型擦除

Java 泛型是通过类型擦除实现的,在编译时会将泛型信息擦除,替换为原始类型(通常是Object)。这意味着运行时不保留泛型类型信息。

理解泛型擦除有助于理解一些泛型的特殊行为和限制。

通过上述内容,你应该对 Java 泛型有了基本的了解。泛型在集合框架中应用广泛,熟练掌握泛型的使用可以提高代码的质量和可维护性。

目录
相关文章
|
11天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1243 5
|
10天前
|
机器学习/深度学习 人工智能 前端开发
通义DeepResearch全面开源!同步分享可落地的高阶Agent构建方法论
通义研究团队开源发布通义 DeepResearch —— 首个在性能上可与 OpenAI DeepResearch 相媲美、并在多项权威基准测试中取得领先表现的全开源 Web Agent。
1220 87
|
11天前
|
云栖大会
阿里云云栖大会2025年9月24日开启,免费申请大会门票,速度领取~
2025云栖大会将于9月24-26日举行,官网免费预约畅享票,审核后短信通知,持证件入场
1800 13
|
20天前
|
人工智能 运维 安全
|
4天前
|
资源调度
除了nrm-pm,还有哪些工具可以管理多个包管理器的源?
除了nrm-pm,还有哪些工具可以管理多个包管理器的源?
235 127
|
4天前
|
前端开发
Promise的then方法返回的新Promise对象有什么特点?
Promise的then方法返回的新Promise对象有什么特点?
180 2