🚀掌握Java中的泛型:类型安全和可重用代码的终极指南💻

Java 中的泛型:综合指南

Java 中的泛型是 Java 5 中引入的一项强大功能,它允许开发人员编写可重用且类型安全的代码。虽然主要用于集合,但它们的应用范围远不止于此。泛型使您可以在编译时指定类型,从而减少运行时错误并增强代码的可读性。

泛型的关键概念

  • 类型安全泛型确保只有指定类型的数据才能添加到集合中或在方法中使用,从而防止运行时出现 ClassCastException。
  • 代码可重用性 单个通用类、方法或接口可以处理各种类型的数据,从而减少冗余并促进代码重用。
  • 泛型的工作原理

  • 通用类 > 通用类允许您定义适用于任何数据类型的类。以下是示例:
  • class Box {
        private T item;
    
        public void setItem(T item) {
            this.item = item;
        }
    
        public T getItem() {
            return item;
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            Box stringBox = new Box<>();
            stringBox.setItem("Hello");
            System.out.println(stringBox.getItem());
    
            Box intBox = new Box<>();
            intBox.setItem(123);
            System.out.println(intBox.getItem());
        }
    }
  • 泛型方法 > 泛型方法允许在方法定义中使用类型参数。
  • class Util {
        public static  void printArray(T[] array) {
            for (T element : array) {
                System.out.println(element);
            }
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            Integer[] intArray = {1, 2, 3};
            String[] strArray = {"A", "B", "C"};
            Util.printArray(intArray);
            Util.printArray(strArray);
        }
    }
  • 有界类型参数 > 可以使用 extends 或 super 来约束类型参数。
  • 上限(扩展):确保类型是指定类型的子类。
  • class MathUtils {
        public static  double square(T number) {
            return number.doubleValue() * number.doubleValue();
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            System.out.println(MathUtils.square(5));    // Integer
            System.out.println(MathUtils.square(5.5)); // Double
        }
    }
  • 下限(超级):确保该类型是指定类型的超类。
  • 通配符 > 通配符(?)代表未知类型,并在使用泛型时提供灵活性。
  • 无限制通配符:
  • public static void printList(List list) {
        for (Object item : list) {
            System.out.println(item);
        }
    }
  • 上限通配符:
  • public static void printNumbers(List list) {
        for (Number num : list) {
            System.out.println(num);
        }
    }
  • 下界通配符:
  • public static void addNumbers(List list) {
        list.add(10); // Only Integer or its subclass can be added
    }

    泛型和集合

    Java 集合框架严重依赖泛型来提供类型安全。

  • 示例:将泛型与列表结合使用
  • import java.util.ArrayList;
    
    public class Main {
        public static void main(String[] args) {
            ArrayList names = new ArrayList<>();
            names.add("Alice");
            names.add("Bob");
    
            for (String name : names) {
                System.out.println(name);
            }
        }
    }
  • 示例:在 Map 中使用泛型
  • import java.util.HashMap;
    
    public class Main {
        public static void main(String[] args) {
            HashMap map = new HashMap<>();
            map.put(1, "One");
            map.put(2, "Two");
    
            for (Integer key : map.keySet()) {
                System.out.println("Key: " + key + ", Value: " + map.get(key));
            }
        }
    }

    泛型的优点

  • 类型安全:通过在编译时捕获类型不匹配来防止运行时错误。
  • 代码可重用性:允许为任何类型编写灵活、可重用的代码。
  • 性能:通过消除显式类型转换的需要来减少运行时开销。
  • 泛型的局限性

  • 类型擦除:泛型是使用类型擦除实现的,因此类型信息在运行时不可用。
  • 不允许使用原始类型:泛型仅适用于对象。使用包装类(如 Integer)来包装 int。
  • 没有静态成员:泛型类不能使用类型参数定义静态字段或方法。
  • 结论

    Java 中的泛型对于编写健壮、可维护且高效的代码至关重要。通过利用类型安全性和代码可重用性,开发人员可以更有效地处理数据。无论您是使用集合还是创建自定义类,掌握泛型对于高级 Java 开发都至关重要。