行业知识
深入理解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