小工具知识网

当前位置: 首页 > 行业知识 > 深入理解Java泛型:灵活、安全、可重用的编程利器

行业知识

深入理解Java泛型:灵活、安全、可重用的编程利器

2026-11-13 17:22:34 来源:互联网转载

Java���型是一项强大的编程特性,为程序员提供了一种灵活、类型安全、可重用的编码方式。通过泛型,我们能够编写更加通用、适应多种数据类型的代码,从而提高了代码的灵活性和可维护性。在这篇博客中,我们将深入探讨Java泛型的各个方面,并通过具体的例子来展示其用法和优势。

1. 泛型类和泛型方法

在以下代码中,printArray 方法使用了泛型类型参数 T,允许我们在运行时指定具体的类型。这种方式使得我们可以编写通用的方法来处理不同类型的数组。

public class Print {    /**     * 打印数组     * @param inputArray     * @param      */    public static  void printArray(T[] inputArray) {        for (T element : inputArray) {            System.out.printf("%s ", element);        }        System.out.println();    }    /**     * 打印整数数组     * @param inputArray     */    public static void IntPrintArray(Integer[] inputArray) {        for (Integer element : inputArray) {            System.out.printf("%s ", element);        }        System.out.println();    }    /**     * 打印字符串数组     * @param inputArray     */    public static void StrPrintArray(String[] inputArray) {        for (String element : inputArray) {            System.out.printf("%s ", element);        }        System.out.println();    }}

然后,我们通过一个示例程序 Method01 来展示泛型方法的应用:

/** * @ClassName: Method01 * @Description: 方法1 感受泛型的好处,泛型方法 * @Author: liu * @Date: 2024-03-09 * @Version: 1.0 **/public class Method01 {    public static void main(String[] args) {        String[] stringArray = {"Hello", "World"};        Integer[] integerArray = {1, 2, 3, 4, 5};        System.out.println("字符串数组包含:");        //StringPrint方法        Print.StrPrintArray(stringArray);        //编译失败 类型不一致        //Print.StrPrintArray(integerArray);        //泛型方法        Print.printArray(stringArray);        System.out.println("\n整数数组包含:");        //IntegerPrint方法        Print.IntPrintArray(integerArray);        //编译失败 类型不一致        //Print.IntPrintArray(stringArray);        //泛型方法,提高代码可用性        Print.printArray(integerArray);        System.out.println("\n整数数组包含:");        Object[] objectArray = {1, 2, 3, 4, 5, "Hello", "World"};        Print.printArray(objectArray);    }}

在上述示例中,我们调用了 printArray 方法,分别传递了字符串数组和整数数组。由于泛型的存在,我们能够使用相同的方法处理不同类型的数据,提高了代码的可重用性。

再举个例子

/** * @ClassName: Method03 * @Description: 方法3 可以存储任意类型的数据 * @Author: liu * @Date: 2024-03-09 * @Version: 1.0 **/public class Method3 {    public static void main(String[] args) {        // 创建一个存储整数的 Box 实例        Box integerBox = new Box();        integerBox.setValue(42);        System.out.println("Integer Value: " + integerBox.getValue());        // 创建一个存储字符串的 Box 实例        Box stringBox = new Box();        stringBox.setValue("Hello, Generics!");        System.out.println("String Value: " + stringBox.getValue());        // 创建一个存储布尔值的 Box 实例        Box booleanBox = new Box();        booleanBox.setValue(true);        System.out.println("Boolean Value: " + booleanBox.getValue());    }}@Dataclass Box {    private T value;}

2. 泛型上限和下限通配符

首先,让我们来看一个简单的泛型类和泛型方法的例子。考虑到动物(Animals)和猫(Cat)、狗(Dog)的实体类:

@Data@AllArgsConstructor@NoArgsConstructorpublic class Animals {    public String name;    public Integer age;}@Datapublic class Cat {    public String name;    public Integer age;    public Say say;    public Cat(String name, Integer age, Say say) {        this.name = name;        this.age = age;        this.say = say;        System.out.println("Cat的全参构造执行,猫边唱歌吃鱼");    }    public Cat() {        System.out.println("Cat的无参构造执行,你创建了猫,却一笑而过!");    }}@EqualsAndHashCode(callSuper = true)@Data@AllArgsConstructor@NoArgsConstructorpublic class Dog extends Animals {    public String name;    public Integer age;}@Datapublic class Say {    public String say;    public Say(String say) {        this.say = say;        System.out.println("说话" + say);    }}

接下来,我们将介绍泛型上限和下限通配符的概念,并通过例子 Method02 进行演示。

/** * @ClassName: Method02 * @Description: 方法2, 泛型上限和下限通配符 * @Author: liu * @Date: 2024-03-09 * @Version: 1.0 **/public class Method02 {    public static void main(String[] args) {/*        Cat cat = new Cat();        Dog dog1 = new Dog("旺财", 3);        Cat cat1 = new Cat("小花", 2, new Say("喵喵喵"));        Animals animal1 = new Animals("小动物", 1);        List dogList = new ArrayList();        List catList = new ArrayList();        List animalsList = new ArrayList();        animalsList.add(animal1);        dogList.add(dog1);        catList.add(cat1);*/        // 使用菱形操作符和双括号初始化简化代码        // 在匿名内部类中,Java 并不允许使用  进行菱形操作符的类型推断,还可以使用 Arrays.asList() 方法        List dogList = new ArrayList(){            private static final long serialVersionUID = -3322276720822396481L;            {            add(new Dog("狗王", 2));            add(new Dog("狗王后", 3));        }};        List catList = Arrays.asList(                new Cat("猫王", 1, new Say("喵~")),                new Cat()        );        List animalsList = new ArrayList(){            private static final long serialVersionUID = 1L;            {            add(new Animals("小动物", 1));        }};        //reason: no instance(s) of type variable(s) exist so that Cat conforms to Animals        //extendMethod(catList);// 编译报错        // 泛型方法调用示例        extendMethod(dogList);  // 合法,List 是 List

上一篇:解决网络下载速度慢的实用技巧

下一篇:NVIDIA GTX 1060显卡功耗深度解析,揭秘背后的秘密