Java 泛型 详解

简介: Java 泛型是 Java 5 引入的特性,允许在类、接口和方法中定义类型参数,提供类型安全、代码重用性和灵活性。泛型包括类型参数、泛型类和接口,以及泛型方法。通过定义类型参数如 `<T>`,可以在编译时检查类型,避免强制类型转换错误。泛型还支持类型边界和通配符,使代码更加灵活和高效。Java 集合框架广泛使用泛型实现类型安全的集合存储。理解泛型的基本概念和使用技巧有助于提高代码质量和可维护性。

Java 泛型(Generics)是 Java 5 引入的一种特性,允许在类、接口和方法中定义类型参数。泛型的使用提供了类型安全、可重用性和灵活性。下面将对 Java 泛型进行详细说明,包括其基本概念、语法、优势和使用示例。

1. 基本概念

  • 类型参数:在泛型中,类型参数是在定义类、接口或方法时使用的占位符。常见的类型参数包括 <T>, <E>, <K, V> 等。
  • 泛型类和接口:通过定义类型参数,可以创建对不同类型的实例进行操作的类和接口。

2. 泛型的语法

2.1 定义泛型类

public class Box<T> {
   
    private T item;

    public void setItem(T item) {
   
        this.item = item;
    }

    public T getItem() {
   
        return item;
    }
}

在这个示例中,Box 类是一个泛型类,其中 T 是类型参数,可以代表任何引用类型。

2.2 定义泛型方法

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

这个 printArray 方法是一个泛型方法,<T> 表示该方法是泛型的,T 可以是任何类型。

3. 泛型的使用示例

3.1 使用泛型类

public class Main {
   
    public static void main(String[] args) {
   
        Box<String> stringBox = new Box<>();
        stringBox.setItem("Hello, Generics!");
        System.out.println(stringBox.getItem());

        Box<Integer> integerBox = new Box<>();
        integerBox.setItem(123);
        System.out.println(integerBox.getItem());
    }
}

在这个例子中,我们创建了不同类型的 Box 实例:Box<String>Box<Integer>

3.2 使用泛型方法

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

        printArray(intArray);
        printArray(strArray);
    }
}

4. 泛型的优势

  1. 类型安全:泛型提供了更高的类型安全性,避免了强制转换的错误,编译器会在编译时检查类型。

  2. 代码重用:使用泛型可以编写一次代码,而在多种数据类型上进行重用,减少了重复代码。

  3. 消除强制类型转换:泛型允许在使用时避免强制类型转换,从而使代码更简洁和安全。

5. 类型边界

在定义泛型时,可以使用类型边界来限制类型参数。

5.1 上界通配符

public static <T extends Number> void processNumbers(T number) {
   
    System.out.println("Number: " + number);
}

// 使用
processNumbers(10); // Integer
processNumbers(10.5); // Double

在这个例子中,T extends Number 表明 T 必须是 Number 类或其子类。

5.2 下界通配符

public static void addNumbers(List<? super Integer> list) {
   
    list.add(10); // 可以添加 Integer 类型
}

// 使用
List<Number> numbers = new ArrayList<>();
addNumbers(numbers);

6. 通配符

通配符(Wildcard)是泛型的一种特殊用法,使用 ? 符号表示。

  • 无界通配符List<?> 可以接收任何类型的 List。
  • 上界通配符List<? extends Number> 可以接收 Number 类型及其子类的 List。
  • 下界通配符List<? super Integer> 可以接收 Integer 类型及其父类的 List。

7. 泛型与集合框架

Java 的集合框架广泛使用泛型。例如,ArrayList<T>, HashMap<K, V> 等,都利用了泛型来实现类型安全的集合存储。

List<String> list = new ArrayList<>();
list.add("Hello");
String item = list.get(0); // 无需强制转换

8. 注意事项

  1. 泛型不能被实例化:不能创建类型参数的实例,例如 T obj = new T(); 是非法的。
  2. 无法使用基本数据类型:不能直接使用基本数据类型(如 intchar),需要使用其包装类(如 IntegerCharacter)。
  3. 类型擦除:Java 泛型在编译时实现,运行时不保留泛型类型的信息,这称为类型擦除。

总结

Java 泛型为编程提供了灵活性和类型安全,减少了重复代码,提高了代码的可读性和可维护性。通过理解泛型的基本概念、语法和使用技巧,开发者可以有效地利用 Java 泛型来设计出更高效的程序。

相关文章
|
6月前
|
存储 算法 安全
JWT深度解析:现代Web身份验证的通行证为什么现在都是JWT为什么要restful-优雅草卓伊凡
JWT深度解析:现代Web身份验证的通行证为什么现在都是JWT为什么要restful-优雅草卓伊凡
351 41
JWT深度解析:现代Web身份验证的通行证为什么现在都是JWT为什么要restful-优雅草卓伊凡
|
消息中间件 存储 缓存
QPS多少,才算高并发 ?
本文详解高并发概念及 QPS 标准,大厂面试高频点,建议掌握收藏。关注【mikechen的互联网架构】,10年+BAT架构经验分享。
QPS多少,才算高并发 ?
lombok的使用
本文介绍了Lombok库的基本使用方法和常用注解,通过示例代码展示了如何使用Lombok简化Java对象的创建、属性访问、日志记录等编码工作,使代码更加简洁。
lombok的使用
|
Java
Java Object 类详解
在 Java 中,`Object` 类是所有类的根类,每个 Java 类都直接或间接继承自 `Object`。作为所有类的超类,`Object` 定义了若干基本方法,如 `equals`、`hashCode`、`toString` 等,这些方法在所有对象中均可使用。通过重写这些方法,可以实现基于内容的比较、生成有意义的字符串表示以及确保哈希码的一致性。此外,`Object` 还提供了 `clone`、`getClass`、`notify`、`notifyAll` 和 `wait` 等方法,支持对象克隆、反射机制及线程同步。理解和重写这些方法有助于提升 Java 代码的可读性和可维护性。
431 20
Java-Thread多线程的使用
这篇文章介绍了Java中Thread类多线程的创建、使用、生命周期、状态以及线程同步和死锁的概念和处理方法。
Java-Thread多线程的使用
|
JavaScript Java Maven
理解固化的Maven依赖:spring-boot-starter-parent 与 spring-boot-dependencies
理解固化的Maven依赖:spring-boot-starter-parent 与 spring-boot-dependencies
6599 1
|
Java
【Java】Java的包装类(Wrapper Classes)
【Java】Java的包装类(Wrapper Classes)
267 0
|
监控 安全 算法
云上智能风控:构建金融安全的智能防线
云上智能风控系统具有良好的灵活性和可扩展性。随着金融市场的不断变化和技术的不断发展,系统能够灵活调整风控策略和算法模型以适应新的风险类型和场景。同时,系统还能够根据业务需求进行功能扩展和升级以满足不同金融机构的个性化需求。
922 7
|
机器学习/深度学习 编解码 人工智能
走进 Sora 的世界:视频重建调研与创新路线图
走进 Sora 的世界:视频重建调研与创新路线图
341 0
|
安全 Java 索引
Java List:从入门到精通,一篇文章就够了!
【6月更文挑战第17天】Java List是有序元素集合,支持索引访问、添加、删除和修改。从ArrayList、LinkedList到Vector,各种实现满足不同场景需求。使用add()添加元素,get()获取,set()修改,remove()删除。遍历可用for-each或Iterator,subList()创建子集。注意线程安全,可选synchronizedList()、Vector或CopyOnWriteArrayList。理解List的基本操作和特性,能提升编程效率。
327 1