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

这篇具有很好参考价值的文章主要介绍了深入理解Java泛型:灵活、安全、可重用的编程利器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

1. 泛型类和泛型方法

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


public class Print {
    /**
     * 打印数组
     * @param inputArray
     * @param <T>
     */
    public static <T> 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 方法,分别传递了字符串数组和整数数组。由于泛型的存在,我们能够使用相同的方法处理不同类型的数据,提高了代码的可重用性。

深入理解Java泛型:灵活、安全、可重用的编程利器,Java功能实现,Java理论知识分享,java,安全,intellij-idea,jvm

再举个例子

/**
 * @ClassName: Method03
 * @Description: 方法3 可以存储任意类型的数据
 * @Author: liu
 * @Date: 2024-03-09
 * @Version: 1.0
 **/
public class Method3 {
    public static void main(String[] args) {
        // 创建一个存储整数的 Box 实例
        Box<Integer> integerBox = new Box<>();
        integerBox.setValue(42);
        System.out.println("Integer Value: " + integerBox.getValue());

        // 创建一个存储字符串的 Box 实例
        Box<String> stringBox = new Box<>();
        stringBox.setValue("Hello, Generics!");
        System.out.println("String Value: " + stringBox.getValue());

        // 创建一个存储布尔值的 Box 实例
        Box<Boolean> booleanBox = new Box<>();
        booleanBox.setValue(true);
        System.out.println("Boolean Value: " + booleanBox.getValue());
    }
}
@Data
class Box<T> {
    private T value;
}

深入理解Java泛型:灵活、安全、可重用的编程利器,Java功能实现,Java理论知识分享,java,安全,intellij-idea,jvm

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

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

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Animals {
    public String name;
    public Integer age;
}

@Data
public 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
@NoArgsConstructor
public class Dog extends Animals {
    public String name;
    public Integer age;
}

@Data
public 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<Dog> dogList = new ArrayList<>();
        List<Cat> catList = new ArrayList<>();
        List<Animals> animalsList = new ArrayList<>();
        animalsList.add(animal1);
        dogList.add(dog1);
        catList.add(cat1);*/

        // 使用菱形操作符和双括号初始化简化代码
        // 在匿名内部类中,Java 并不允许使用 <> 进行菱形操作符的类型推断,还可以使用 Arrays.asList() 方法

        List<Dog> dogList = new ArrayList<Dog>(){
            private static final long serialVersionUID = -3322276720822396481L;

            {
            add(new Dog("狗王", 2));
            add(new Dog("狗王后", 3));
        }};
        List<Cat> catList = Arrays.asList(
                new Cat("猫王", 1, new Say("喵~")),
                new Cat()
        );
        List<Animals> animalsList = new ArrayList<Animals>(){
            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<Dog> 是 List<? extends Animals> 的子类
        extendMethod(animalsList);  // 合法,List<Animals> 是 List<? extends Animals> 的子类

        System.out.println("=====================================");

        superMethod(dogList);  // 合法
        //编译报错,List<Cat> 不是 List<? super Dog> 的子类
        //superMethod(catList);
        //编译合法,运行报错UnsupportedOperationException
        //superMethod(Collections.unmodifiableList(catList));
        superMethod(animalsList);  // 合法
    }

    public static <T extends Animals> void extendMethod(List<T> list) {
        // 在这里处理只包含数字类型及其子类的列表
        for (T element : list) {
            System.out.println(element);
        }
    }
    public static void superMethod(List<? super Dog> list) {
        // 在这里处理只包含数字类型及其父类的列表
        list.add(new Dog("二狗", 2));
        //list.add(new Animals("Buddy", 2)); // 编译报错
        for (Object element : list) {
            System.out.println(element);
        }
    }
}

在上述代码中,extendMethod 方法接受一个泛型列表,其中的元素必须是 Animals 类型或其子类。而 superMethod 方法则接受一个泛型列表,其中的元素必须是 Dog 类型或其父类。这样的灵活性使得我们能够对不同层次的类进行处理。

Method02 的示例程序中,我们演示了泛型上限和下限通配符的使用:

在这个示例中,我们展示了如何使用泛型上限和下限通配符来处理不同类型的列表,使得我们的代码更具通用性和灵活性。

深入理解Java泛型:灵活、安全、可重用的编程利器,Java功能实现,Java理论知识分享,java,安全,intellij-idea,jvm

3. 灵活处理多个泛型参数

在实际的编程场景中,有时我们需要处理多个泛型参数的情况。在这个章节,将探讨如何在Java中灵活地处理多个泛型参数,以满足更为复杂的编码需求。

代码如下:


/**
 * @ClassName: Method04
 * @Description: 演示带有多个泛型参数的Pair类的使用
 * @Author: 阿水
 * @Date: 2024-03-10
 * @Version: 1.0
 **/
public class Method04 {
    public static void main(String[] args) {
        // 创建一个带有泛型参数的Pair实例
        Pair<Dog, Cat> pair = new Pair<>();
        // 创建狗和猫的实例
        Dog dog = new Dog("旺财", 3);
        Cat cat = new Cat("小花", 2, new Say("喵喵喵"));
        // 设置Pair实例的值
        pair.setFirst(dog);
        pair.setSecond(cat);
        // 打印Pair实例的字符串表示形式以及其中的元素
        System.out.println(pair);
        System.out.println("First Element: " + pair.getFirst().getName());
        System.out.println("Second Element: " + pair.getSecond().getName());
        // 创建带有不同泛型参数的两个Pair实例
        Pair<String, Integer> pair1 = new Pair<>("One", 1);
        Pair<Double, String> pair2 = new Pair<>(6.66, "Pi");
        // 调用泛型方法打印Pair实例的值
        printPair(pair1);
        printPair(pair2);

    }

    /**
     * 打印带有泛型参数的Pair实例的值
     *
     * @param pair 带有泛型参数的Pair实例
     * @param <T>  第一个元素的类型
     * @param <U>  第二个元素的类型
     */
    public static <T, U> void printPair(Pair<T, U> pair) {
        System.out.println("Pair: " + pair.getFirst() + ", " + pair.getSecond());
    }
}

/**
 * @ClassName: Pair
 * @Description: 带有两个泛型参数的Pair类
 * @Author: 阿水
 * @Date: 2024-03-10
 * @Version: 1.0
 **/
@Data
@AllArgsConstructor
@NoArgsConstructor
class Pair<T, U> {
    private T first;
    private U second;
}

运行结果如下:

深入理解Java泛型:灵活、安全、可重用的编程利器,Java功能实现,Java理论知识分享,java,安全,intellij-idea,jvm

4.总结

Java泛型是一项强大的编程特性,通过泛型类和泛型方法,我们能够编写通用、灵活的代码。同时,泛型上限和下限通配符使得我们能够更好地处理不同层次的类。通过这篇博客,我们深入理解了Java泛型的灵活性、安全性和可重用性,为我们的编程工作提供了更多的便利和可能性。文章来源地址https://www.toymoban.com/news/detail-842132.html

到了这里,关于深入理解Java泛型:灵活、安全、可重用的编程利器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 深入理解Java泛型、协变逆变、泛型通配符、自限定

    重写了之前博客写的泛型相关内容,全部整合到这一篇文章里了,把坑都填了,后续不再纠结这些问题了。本文深度总结了函数式思想、泛型对在Java中的应用,解答了许多比较难的问题。 纯函数 协变 逆变 泛型通配符 PECS法则 自限定 Java8 引入了函数式接口,从此方法传参可

    2023年04月20日
    浏览(55)
  • 「Java」《深入解析Java多线程编程利器:CompletableFuture》

    多线程编程是指在一个程序中同时执行多个线程来提高系统的并发性和响应性。在现代计算机系统中,多线程编程已经成为开发者日常工作的一部分。以下是对多线程编程需求和挑战的介绍: 需求: 提高系统的性能:通过同时执行多个线程,可以利用多核处理器的优势,实

    2024年02月11日
    浏览(50)
  • Java泛型:灵活多变的类型参数化工具

    👑专栏内容:Java ⛪个人主页:子夜的星的主页 💕座右铭:前路未远,步履不停 在传统的编程方法中,类和方法通常被限定为使用特定的类型。这些类型可能是基础的数据类型(如整数、字符等),或者是由程序员自己定义的复杂类型。这种方式在处理单一类型数据时很有

    2024年02月01日
    浏览(61)
  • 深入理解Java多线程编程

            Java的多线程编程在现代应用程序中扮演着重要的角色。它可以提高应用程序的性能、并发处理能力和响应性。然而,多线程编程也带来了一些挑战,如线程安全、死锁和资源竞争等问题。本文将深入探讨Java多线程编程的基本概念和最佳实践。 1. 理解线程和进程

    2024年02月08日
    浏览(54)
  • VLAN——提高网络性能、安全性和灵活性的利器

    VLAN是Virtual Local Area Network的缩写,它是一种通过网络交换机虚拟划分局域网的技术。VLAN可以将一个物理局域网划分成多个逻辑上的虚拟局域网,各个虚拟局域网之间相互独立,彼此隔离,进而提高网络性能、灵活性和安全性。本文将为大家介绍VLAN的工作原理、优点及应用场

    2024年02月07日
    浏览(47)
  • “深入理解Java的多线程编程“

    多线程编程是指在一个程序中同时运行多个线程,以提高程序的并发性和性能。Java是一门支持多线程编程的强大编程语言,提供了丰富的多线程相关类和接口。 在Java中,可以通过以下方式实现多线程编程: 继承Thread类:创建一个继承自Thread类的子类,并重写run()方法,在

    2024年02月13日
    浏览(67)
  • Java网络编程-深入理解BIO、NIO

    BIO BIO 为 Blocked-IO(阻塞 IO),在 JDK1.4 之前建立网络连接时,只能使用 BIO 使用 BIO 时,服务端会对客户端的每个请求都建立一个线程进行处理,客户端向服务端发送请求后,先咨询服务端是否有线程响应,如果没有就会等待或者被拒绝 BIO 基本使用代码: 服务端: 客户端:

    2024年02月04日
    浏览(40)
  • java中的方法返回值使用泛型,实现灵活的返回值类型

      使用Mybatis框架的时候,想封装一个底层JDBC控制器,用于提供和Mybatis交互的增删改查接口(公用的接口),但由于公用的查询方法可能是用户自定义的任意一个和表对应的java bean类型,所以要考虑怎么样给调用者返回正确的返回值类型,不需要调用者自己强转型的动作(例

    2024年02月06日
    浏览(53)
  • 【并发编程】深入理解Java并发之synchronized实现原理

    分析: 通过 new MyThread() 创建了一个对象 myThread ,这时候堆中就存在了共享资源 myThread ,然后对 myThread 对象创建两个线程,那么thread1线程和thread2线程就会共享 myThread 。 thread1.start() 和 thead2.start() 开启了两个线程,CPU会随机调度这两个线程。假如 thread1 先获得 synchronized 锁,

    2024年02月04日
    浏览(60)
  • [AIGC] 深入理解Java并发编程:从入门到进阶

    在计算机领域中,针对多核处理器的高并发需求,Java并发编程成为了一项重要的技能。Java提供了丰富的并发编程工具和API,使得开发者能够有效地利用多核处理器的优势。本文将介绍Java并发编程的基础概念、常用技术和最佳实践,帮助读者深入理解Java并发编程。 线程和进

    2024年01月21日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包