详解 Java 泛型:核心概念与实用示例

简介: 详解 Java 泛型:核心概念与实用示例

详解 Java 泛型:核心概念与实用示例

Java 泛型(Generics)是Java SE 5引入的一项特性,旨在提高代码的可重用性和类型安全性。通过泛型,开发者可以编写一个通用的类、接口或方法,可以与多种类型一起工作,而不需要为每种类型创建不同的版本。

泛型的核心概念

泛型类(Generic Class)

泛型类是包含一个或多个类型参数的类。例如:

public class Box<T> {
    private T content;

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

    public T getContent() {
        return content;
    }
}

这里,T 是类型参数,可以在创建 Box 对象时指定具体的类型:

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

Box<Integer> integerBox = new Box<>();
integerBox.setContent(123);

泛型方法(Generic Method):

泛型方法是包含类型参数的方法。类型参数在方法的声明中被指定。例如:

public class GenericMethodExample {

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

    public static void main(String[] args) {
        Integer[] intArray = {1, 2, 3, 4};
        String[] stringArray = {"A", "B", "C"};

        printArray(intArray);
        printArray(stringArray);
    }
}

泛型接口(Generic Interface):

泛型接口和泛型类类似。它们允许类型参数在接口中使用。例如:

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; }
}

类型通配符(Wildcard):

泛型中的通配符用于表示未知类型。通配符有三种形式:

  • 无限制通配符(?):表示任何类型。
public void printList(List<?> list) {
    for (Object elem : list) {
        System.out.println(elem);
    }
}
  • 有上限的通配符(? extends Type):表示类型是 Type 或其子类。
public void processList(List<? extends Number> list) {
    for (Number num : list) {
        System.out.println(num);
    }
}
  • 有下限的通配符(? super Type):表示类型是 Type 或其父类。
public void addNumber(List<? super Integer> list) {
    list.add(new Integer(123));
}

类型擦除(Type Erasure):

泛型在编译时会进行类型擦除,这意味着泛型类型在运行时被移除,并替换为其限定类型(如果未指定,则为 Object)。这使得泛型可以与非泛型代码互操作。

public class Box<T> {
    private T content;

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

    public T getContent() {
        return content;
    }
}

编译后:

public class Box {
    private Object content;

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

    public Object getContent() {
        return content;
    }
}

使用泛型的注意事项

不能创建泛型类型的实例

public class Box<T> {
    // T t = new T(); // 错误:不能直接创建泛型类型的实例
}

静态成员不能使用类型参数

public class Box<T> {
    // private static T content; // 错误:静态变量不能使用类型参数
}

泛型数组创建受限

public class Box<T> {
    // T[] array = new T[10]; // 错误:不能直接创建泛型数组
}

示例:使用泛型的栈

public class GenericStack<T> {
    private List<T> stack = new ArrayList<>();

    public void push(T element) {
        stack.add(element);
    }

    public T pop() {
        if (!stack.isEmpty()) {
            return stack.remove(stack.size() - 1);
        }
        return null;
    }

    public boolean isEmpty() {
        return stack.isEmpty();
    }

    public static void main(String[] args) {
        GenericStack<String> stringStack = new GenericStack<>();
        stringStack.push("Hello");
        stringStack.push("World");
        System.out.println(stringStack.pop()); // 输出:World

        GenericStack<Integer> intStack = new GenericStack<>();
        intStack.push(1);
        intStack.push(2);
        System.out.println(intStack.pop()); // 输出:2
    }
}

结论

Java 泛型提供了一种类型安全的方式来实现通用编程。它们不仅提高了代码的可读性和可维护性,还避免了类型转换的错误。在编写通用类、接口和方法时,泛型是一个强大的工具。

目录
相关文章
|
22天前
|
Java 开发工具
【Azure Storage Account】Java Code访问Storage Account File Share的上传和下载代码示例
本文介绍如何使用Java通过azure-storage-file-share SDK实现Azure文件共享的上传下载。包含依赖引入、客户端创建及完整示例代码,助你快速集成Azure File Share功能。
299 4
|
1月前
|
Java 编译器 Go
【Java】(5)方法的概念、方法的调用、方法重载、构造方法的创建
Java方法是语句的集合,它们在一起执行一个功能。方法是解决一类问题的步骤的有序组合方法包含于类或对象中方法在程序中被创建,在其他地方被引用方法的优点使程序变得更简短而清晰。有利于程序维护。可以提高程序开发的效率。提高了代码的重用性。方法的名字的第一个单词应以小写字母作为开头,后面的单词则用大写字母开头写,不使用连接符。例如:addPerson。这种就属于驼峰写法下划线可能出现在 JUnit 测试方法名称中用以分隔名称的逻辑组件。
168 4
|
2月前
|
IDE Java 关系型数据库
Java 初学者学习路线(含代码示例)
本教程为Java初学者设计,涵盖基础语法、面向对象、集合、异常处理、文件操作、多线程、JDBC、Servlet及MyBatis等内容,每阶段配核心代码示例,强调动手实践,助你循序渐进掌握Java编程。
326 3
|
2月前
|
安全 Java
Java之泛型使用教程
Java之泛型使用教程
210 10
|
2月前
|
Java
java入门代码示例
本文介绍Java入门基础,包含Hello World、变量类型、条件判断、循环及方法定义等核心语法示例,帮助初学者快速掌握Java编程基本结构与逻辑。
352 0
Java API 开发者
81 0
|
4月前
|
存储 缓存 NoSQL
java 集合入门基础理论的核心概念与实用长尾知识
本文介绍了Java集合框架的基础理论知识,包括单列集合(List、Set、Queue)和双列集合(Map)的特点及常用实现类(如ArrayList、HashSet、HashMap等)。详细讲解了集合的遍历方式(迭代器、增强for循环、Lambda表达式)和典型应用场景(如数据去重、键值存储等)。通过具体代码示例,帮助初学者理解集合框架的核心概念和实际应用,为Java编程中的数据存储与管理提供基础指导。
127 0
|
4月前
|
安全 Java 网络安全
Java 实现 SMTP 协议调用的详细示例及实战指南 SMTP Java 调用示例
本文介绍了如何使用Java调用SMTP协议发送邮件,涵盖SMTP基本概念、JavaMail API配置、代码实现及注意事项,适合Java开发者快速掌握邮件发送功能集成。
383 0
|
4月前
|
算法 搜索推荐 Java
Java中的Collections.shuffle()方法及示例
`Collections.shuffle()` 是 Java 中用于随机打乱列表顺序的方法,基于 Fisher-Yates 算法实现,支持原地修改。可选传入自定义 `Random` 对象以实现结果可重复,适用于抽奖、游戏、随机抽样等场景。
179 0