java 之 泛型的详细介绍

news2024/11/20 8:37:16

在这里插入图片描述

文章目录

      • 1. 为什么需要泛型?
      • 2. 泛型的基本概念
      • 3. 泛型类的例子
      • 4. 泛型方法的例子
      • 5. 泛型的好处
    • 泛型使用的位置
      • 1. 泛型类(Generic Class):
      • 2. 泛型接口(Generic Interface):
      • 3. 泛型方法(Generic Method):
      • 4. 泛型通配符(Generic Wildcard):
      • 5. 泛型上下界(Generic Bounds):
      • 6. 泛型数组(Generic Array):

当我们谈到“泛型”时,我们实际上是在谈论一种在编程中用来处理不同类型数据的方法。想象一下,你写了一个很好用的方法或者类,但是它只能处理一种特定类型的数据,如果你想处理其他类型,你就得重写或者重新实现。这时,泛型就派上用场了。

1. 为什么需要泛型?

考虑一个简单的例子,比如一个存储数据的盒子(Box)。你可能想要一个可以存储整数的盒子,也可能需要一个可以存储字符串的盒子。如果没有泛型,你可能需要为每一种数据类型写一个不同的盒子类。

泛型就是为了解决这样的问题。它允许你写一个通用的类或者方法,可以适用于多种数据类型,而不用为每一种类型写不同的代码。

2. 泛型的基本概念

在使用泛型时,我们通常会看到一些带尖括号的符号 <T>,其中 T 是类型的占位符。这个 T 可以是任何你希望使用的数据类型。当你实际使用泛型时,你会将这个占位符替换成你实际想要的类型。

3. 泛型类的例子

比如,有一个 Box 类,你可以用它来存储各种类型的数据:

public class Box<T> {
    private T value;

    public Box(T value) {
        this.value = value;
    }

    public T getValue() {
        return value;
    }
}

这里的 <T> 表示这是一个泛型类,T 是一个占位符,代表实际的类型。你可以创建一个存储整数的盒子:

Box<Integer> intBox = new Box<>(42);

或者创建一个存储字符串的盒子:

Box<String> stringBox = new Box<>("Hello, Generics!");

4. 泛型方法的例子

同样,你也可以在方法中使用泛型。比如,有一个泛型方法,可以打印任意类型的数据:

public class Utils {
    public static <T> void printValue(T value) {
        System.out.println("Value: " + value);
    }
}

你可以用这个方法来打印整数:

Utils.printValue(42);

或者打印字符串:

Utils.printValue("Hello, Generics!");

5. 泛型的好处

  • 代码重用: 你可以编写更通用、可重用的代码,而不用为每一种数据类型写不同的实现。
  • 类型安全: 编译器会在编译时检查类型,防止一些在运行时可能出现的类型错误。
  • 简化代码: 不再需要进行强制类型转换,代码更加清晰简洁。

泛型可能在一开始看起来有点抽象,但一旦你理解了它的基本概念,你会发现它是一种非常有用的工具,能够让你的代码更加灵活、通用和安全。

泛型使用的位置

泛型可以在很多不同的位置使用,包括类、接口、方法等。下面是一些常见的使用位置:

1. 泛型类(Generic Class):

public class Box<T> {
    private T value;

    public Box(T value) {
        this.value = value;
    }

    public T getValue() {
        return value;
    }

    public static void main(String[] args) {
        // 使用泛型类存储整数
        Box<Integer> intBox = new Box<>(42);
        int intValue = intBox.getValue();

        // 使用泛型类存储字符串
        Box<String> stringBox = new Box<>("Hello, Generics!");
        String stringValue = stringBox.getValue();
    }
}

在类的声明中,使用 <T> 表示这是一个泛型类,T 是一个类型参数。

2. 泛型接口(Generic Interface):

public interface Pair<T> {
    T getFirst();
    T getSecond();
}

// 实现泛型接口
class OrderedPair<T> implements Pair<T> {
    private T first;
    private T second;

    public OrderedPair(T first, T second) {
        this.first = first;
        this.second = second;
    }

    public T getFirst() {
        return first;
    }

    public T getSecond() {
        return second;
    }

    public static void main(String[] args) {
        // 创建存储整数的OrderedPair对象
        OrderedPair<Integer> pair = new OrderedPair<>(10, 20);
        int firstValue = pair.getFirst();
        int secondValue = pair.getSecond();
    }
}

同样,在接口的声明中,使用 <T> 表示这是一个泛型接口。

3. 泛型方法(Generic Method):

public class Utils {
    public static <T> void printValue(T value) {
        System.out.println("Value: " + value);
    }

    public static void main(String[] args) {
        // 调用泛型方法,编译器会根据传入参数的类型进行类型推断
        printValue("Hello, Generics!");
        printValue(42);
    }
}

在方法的返回类型之前,使用 <T> 表示这是一个泛型方法。泛型方法允许你在调用时指定类型参数,而不是在整个类或接口中指定。

4. 泛型通配符(Generic Wildcard):

有时,你可能不关心泛型的具体类型,而只想表示它是某个类型的子类。这时可以使用通配符 ?

import java.util.List;

public class GenericWildcardExample {
    public void processList(List<?> list) {
        // 处理 list 中的元素,但不关心具体类型
        for (Object item : list) {
            System.out.println(item);
        }
    }
}

5. 泛型上下界(Generic Bounds):

有时,你希望限制泛型的类型范围,可以使用上下界:

public class GenericBoundsExample {
    public <T extends Number> void processNumber(T number) {
        // 处理数字类型的数据
        double square = number.doubleValue() * number.doubleValue();
        System.out.println("Square: " + square);
    }
}

这表示 T 必须是 Number 类型或其子类。

6. 泛型数组(Generic Array):

在 Java 中,创建泛型数组是有限制的,不能直接使用 new T[] 的方式创建泛型数组。通常可以使用 List 来代替。

import java.util.ArrayList;
import java.util.List;

public class GenericArrayExample {
    public <T> List<T> createGenericList(T... elements) {
        List<T> list = new ArrayList<>();
        for (T element : elements) {
            list.add(element);
        }
        return list;
    }

    public static void main(String[] args) {
        GenericArrayExample example = new GenericArrayExample();
        
        // 创建存储整数的列表
        List<Integer> intList = example.createGenericList(1, 2, 3);
        
        // 创建存储字符串的列表
        List<String> stringList = example.createGenericList("A", "B", "C");
    }
}

总体而言,泛型的使用位置取决于你的需求。在大多数情况下,你可能会在类和方法上使用泛型,以实现更通用和灵活的代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1204105.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue2按需导入Element(vite打包)

1.安装element 说明&#xff1a;-S是生产依赖。 npm install element-ui2 -S 2.安装babel-plugin-component 说明&#xff1a;-D是开发模式使用。 npm install babel-plugin-component -D 3. vite.config.js 说明&#xff1a;借助 babel-plugin-component &#xff0c;我们可…

人工智能极简史:一文读懂ChatGPT的前世今生

2022年11月30日&#xff0c;OpenAI推出的一款人工智能技术驱动的自然语言处理工具——ChatGPT&#xff0c;迅速在社交媒体上走红&#xff0c;短短5天&#xff0c;注册用户数就超过100万。 2023年1月末&#xff0c;ChatGPT的月活用户已突破1亿&#xff0c;一度成为史上增长最快的…

JSON.parse --- 搜索框

一 &#xff0c; JSON.parse this.num_normsTwo JSON.parse(res.result.normsTwo) 二. 搜索框 <template><div class"app-container"><span style"margin-left:120px;margin-right: 20px;width: 100px; display: inline-block;">物…

大语言模型可以学习规则11.13

大型语言模型可以学习规则 摘要1 引言2 准备3 从假设到理论3.1 诱导阶段&#xff1a;规则生成和验证3.2 演绎阶段&#xff1a;使用规则库进行显式推理 4 实验评估实验装置4.2 数字推理 5 相关工作 摘要 当提示一些例子和中间步骤时&#xff0c;大型语言模型&#xff08;LLM&am…

【网络豆送书第六期】《嵌入式虚拟化技术与应用》

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 公众号&#xff1a;网络豆云计算学堂 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a; 网络豆的主页​​​​​ 本期好书推荐&#xff1a;《嵌入式虚拟化技术与应用…

面试 | 再也不怕被问 Binder 机制了

Binder 机制 Binder 机制是 Android 特有的一种进程间通信&#xff08;IPC&#xff09;方式 1.1 Binder 机制的作用和原理&#xff1f; Linux系统将一个进程分为用户空间和内核空间。对于进程之间来说&#xff0c;用户空间的数据不可共享&#xff0c;内核空间的数据可共享&a…

Django下的Race Condition漏洞

目录 环境搭建 无锁无事务的竞争攻击复现 无锁有事务的竞争攻击复现 悲观锁进行防御 乐观锁进行防御 环境搭建 首先我们安装源码包&#xff1a;GitHub - phith0n/race-condition-playground: Playground for Race Condition attack 然后将源码包上传到Ubuntu 为了方便使…

python双端队列_中间是头两边是尾_两边是头中间是尾

双端队列的顺序表存储结构以及两种特殊的双端队列 双端队列 是一种允许我们同时从前端和后端添加和删除元素的特殊队列&#xff0c;它是队列和栈的结合体。 双端队列&#xff08;deque&#xff09;与队列&#xff08;queue&#xff09;就差了两个字&#xff0c;队列里元素只能…

uniapp——项目day04

购物车页面——商品列表区域 渲染购物车商品列表的标题区域 1. 定义如下的 UI 结构&#xff1a; 2.美化样式 渲染商品列表区域的基本结构 1. 通过 mapState 辅助函数&#xff0c;将 Store 中的 cart 数组映射到当前页面中使用&#xff1a; import badgeMix from /mixins/tab…

2023年【建筑电工(建筑特殊工种)】找解析及建筑电工(建筑特殊工种)复审考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 建筑电工(建筑特殊工种)找解析是安全生产模拟考试一点通生成的&#xff0c;建筑电工(建筑特殊工种)证模拟考试题库是根据建筑电工(建筑特殊工种)最新版教材汇编出建筑电工(建筑特殊工种)仿真模拟考试。2023年【建筑电…

1 Supervised Machine Learning Regression and Classification

文章目录 Week1OverViewSupervised LearningUnsupervised LearningLinear Regression ModelCost functionGradient Descent Week2Muliple FeatureVectorizationGradient Descent for Multiple RegressionFeature ScalingGradient DescentFeature EngineeringPolynomial Regress…

数据结构线性表——栈

前言&#xff1a;哈喽小伙伴们&#xff0c;今天我们将一起进入数据结构线性表的第四篇章——栈的讲解&#xff0c;栈还是比较简单的哦&#xff0c;跟紧博主的思路&#xff0c;不要掉队哦。 目录 一.什么是栈 二.如何实现栈 三.栈的实现 栈的初始化 四.栈的操作 1.数据入栈…

CTFhub-RCE-读取源代码

源代码&#xff1a; <?php error_reporting(E_ALL); if (isset($_GET[file])) { if ( substr($_GET["file"], 0, 6) "php://" ) { include($_GET["file"]); } else { echo "Hacker!!!"; } } else {…

重磅!2024QS亚洲大学排名出炉!北大蝉联榜首,港大反超新国立、清华!

2023年11月8日&#xff0c;全球高等教育分析机构QS Quacquarelli Symonds发布了2024年QS世界大学排名&#xff1a;亚洲大学排名。 本次排名全方位评估了来自亚洲25个国家和地区的856所大学在全球认可度、研究实力、教学资源和国际化等方面的表现&#xff0c;有148所院校首次跻…

绝望了,软件测试的行业基本盘,崩了......

不得不承认&#xff0c;现在工作不好找 去年很多人都觉得今年的就业环境会好很多&#xff0c;但是到了现在都发现之前想错了&#xff0c;实际上是一塌糊涂… 于是有了很多年轻人焦虑日常的灵魂一问&#xff1a;“快半年了&#xff0c;找不到工作&#xff0c;我好焦虑&#xf…

Git的GUI图形化工具ssh协议IDEA集成Git

一、GIT的GUI图形化工具 1、介绍 Git自带的GUI工具&#xff0c;主界面中各个按钮的意思基本与界面文字一致&#xff0c;与git的命令差别不大。在了解自己所做的操作情况下&#xff0c;各个功能点开看下就知道是怎么操作的。即使不了解&#xff0c;只要不做push操作&#xff0c…

LeetCode-剑指 Offer 22. 链表中倒数第k个节点(C语言 )

目录捏 一、题目描述二、示例与提示三、思路四、代码 一、题目描述 给定一个头节点为 head 的链表用于记录一系列核心肌群训练项目编号&#xff0c;请查找并返回倒数第 cnt 个训练项目编号。 二、示例与提示 示例 1&#xff1a; 输入&#xff1a; head [2,4,7,8], cnt 1 输…

Linux 源码包安装

SRPM 包&#xff0c;比 RPM 包多了一个“S”&#xff0c;是“Source”的首字母&#xff0c;所以 SRPM 可直译为“源代码形式的 RPM 包”。也就是说&#xff0c;SRPM 包中不再是经过编译的二进制文件&#xff0c;都是源代码文件。可以这样理解&#xff0c;SRPM 包是软件以源码形…

新生儿母乳过敏:原因、科普和注意事项

引言&#xff1a; 母乳过敏是一种较为罕见但可能令家长担忧的现象。母亲通常认为母乳是新生儿最安全、最适合的食物&#xff0c;然而有时候宝宝可能对母乳中的某些成分产生过敏反应。本文将科普新生儿母乳过敏的原因&#xff0c;提供相关信息&#xff0c;并为父母和监护人提供…