当前位置: 首页 > article >正文

Java小白入门教程:泛型,泛型类型参数<T> <K> <V> <E>(必须Get的知识)

目录

一、定义

二、作用

1、类型安全

2、代码复用

3、提高性能

三、使用场景

1、集合框架

2、类和接口

3、方法

四、语法及示例

1、泛型类

2、泛型接口

3、泛型方法

五、完整示例


一、定义

        泛型(Generics)是Java 5中引入的一个特性它允许在编写代码时指定类型参数

        简单来说泛型就像是类型的一个占位符,可以在创建类接口或方法时使用,然后在运行时指定具体的类型

二、作用

1、类型安全

        泛型可以保证在编译时检查类型错误,避免在运行时出现ClassCastException

2、代码复用

        通过泛型,可以编写更通用的代码,适用于多种数据类型

3、提高性能

        使用泛型可以减少对类型的强制转换,提高代码的运行效率

三、使用场景

1、集合框架

        ArrayList、HashMap等,使用泛型可以指定集合中元素的类型。

2、类和接口

        定义类或接口时,可以使用泛型来创建更通用的结构。

3、方法

        定义方法时,可以使用泛型来处理不同类型的参数。

四、语法及示例

1、泛型类

        `<T>`里的`T`,就像是你放了一个标记来占一个座位,比如一本书或者一个水杯。

        这个座位不固定给谁,可以是任何人(任何类型)。

        `T`就是那个小标记,它告诉我们:这个位置是给将来某个类型的东西预留的。

public class Box<T> { // T是类型参数,可以是任何类型
    private T t; // T类型的成员变量

    public void set(T t) { // T类型的参数
        this.t = t;
    }

    public T get() { // 返回T类型的数据
        return t;
    }
}

2、泛型接口

        这个`Generator`接口就像是一个工厂的说明书,它说:“我这里有个方法叫`next`,每次你调用它,我就会给你造一个类型为T的东西出来。”

        简单来说,就是每次用这个方法,都能拿到一个你想要的那种类型的新东西。

public interface Generator<T> {
    T next(); // 返回T类型的数据
}

3、泛型方法

        `K`是名字,`V`是东西。

        看到`<K, V>`,就想象成一个“名字-东西”的对儿。 `Map<K, V>`就像是一个帮你记住每样东西名字的盒子,你一说名字(键),它就能给你找到对应的东西(值)。简单说,就是用`K`找`V`的一个小帮手。

public class Util {
    public static <K, V> boolean compare(Pair<K, V> p1, Pair<K, V> p2) {
        return p1.getKey().equals(p2.getKey()) &&
               p1.getValue().equals(p2.getValue());
    }
}

五、完整示例

public class Test {
    public static void main(String[] args) {
        // 创建一个只能装Integer的盒子
        Box<Integer> integerBox = new Box<Integer>();
        // 把整数10放进盒子里,自动装箱成Integer
        integerBox.set(10);
        // 打印盒子里的整数
        System.out.println("整数值: " + integerBox.get());

        // 创建一个只能装String的盒子
        Box<String> stringBox = new Box<String>();
        // 把字符串"Hello World"放进盒子里
        stringBox.set("Hello World");
        // 打印盒子里的字符串
        System.out.println("字符串: " + stringBox.get());

        // 创建两个包含字符串和整数的Pair对象
        Pair<String, Integer> p1 = new Pair<>("苹果", 1);
        Pair<String, Integer> p2 = new Pair<>("苹果", 1);
        // 比较这两个Pair对象是否相同
        boolean same = Util.compare(p1, p2);
        // 打印比较结果
        System.out.println("两个Pair是否相同: " + same);
    }
}

// 定义一个泛型类Pair,可以装任意类型的键和值
class Pair<K, V> {
    private K key; // 键
    private V value; // 值

    // 构造方法,初始化键和值
    public Pair(K key, V value) {
        this.key = key;
        this.value = value;
    }

    // 获取键的方法
    public K getKey() {
        return key;
    }

    // 获取值的方法
    public V getValue() {
        return value;
    }
}

// 泛型方法compare的类Util没有定义,这里假设它存在并且能够比较Pair对象
class Util {
    // 泛型方法,比较两个Pair对象是否相同
    public static <K, V> boolean compare(Pair<K, V> p1, Pair<K, V> p2) {
        return p1.getKey().equals(p2.getKey()) && p1.getValue().equals(p2.getValue());
    }
}

http://www.kler.cn/a/528510.html

相关文章:

  • 群晖搭建Gitea教程(使用系统自带的postgresql)
  • 知识库管理如何推动企业数字化转型与创新发展的深层次探索
  • python 使用Whisper模型进行语音翻译
  • C++和Python实现SQL Server数据库导出数据到S3并导入Redshift数据仓库
  • Nuxt:利用public-ip这个npm包来获取公网IP
  • 【Pandas】pandas Series cumsum
  • WSL2中安装的ubuntu开启与关闭探讨
  • 使用Pygame制作“吃豆人”游戏
  • Spring Boot 实例解析:HelloWorld 探究
  • 【LeetCode 刷题】二叉树-二叉搜索树的属性
  • 我用Ai学Android Jetpack Compose之Box
  • 3 Flink 运行架构
  • 关于系统重构实践的一些思考与总结
  • 攻防世界_PHP2
  • Web-3.0(Solidity)ERC-20
  • 【Uniapp-Vue3】获取用户状态栏高度和胶囊按钮高度
  • 手撕Vision Transformer -- Day1 -- 基础原理
  • 【react-redux】react-redux中的 useDispatch和useSelector的使用与原理解析
  • 2 Flink 部署及启动
  • 基于Python的简单企业维修管理系统的设计与实现
  • TypeScript 运算符
  • 【毕业与课程大作业参考】基于 yolov8+pyqt5 界面自适应的表情识别检测系统 demo
  • Java中对消息序列化和反序列化并且加入到Spring消息容器中
  • 语音识别播报人工智能分类垃圾桶(论文+源码)
  • 使用HttpClient和HttpRequest发送HTTP请求
  • 软件工程中的需求工程