Java 中的泛型(Generics)零基础入门到精通,收藏这篇就够了

Java语言的泛型(Generics) 泛型类是一种带有类型参数的类,可以在实例化时指定具体的类型。以下是一个简单的泛型类的示例:```java。 阅读详情
文章目录
    • Java 中的泛型(Generics)
      • 1. 泛型的概念
    • 2. 泛型的优势
    • 3. Java 泛型的使用
      • (1) 泛型类
        • 示例
      • (2) 泛型方法
        • 示例
      • (3) 泛型接口
        • 示例
      • (4) 泛型的通配符
        • (a) `?`(无界通配符)
        • (b) `? extends T`(上界通配符)
        • © `? super T`(下界通配符)
      • (5) 泛型与类型擦除
        • 示例
    • 4. 泛型的限制
    • 5. 总结

Java 中的泛型(Generics)

1. 泛型的概念

泛型(Generics)是 Java 5 引入的一种特性,允许编写类型安全、可复用的代码。泛型主要用于类、接口和方法,能够在编译时进行类型检查,而不需要在运行时进行强制类型转换。


2. 泛型的优势

  • 类型安全(Type Safety):避免 ClassCastException,在编译阶段进行类型检查。
  • 代码复用(Code Reusability):相同的代码可以适用于多种数据类型,减少代码冗余。
  • 可读性和可维护性:减少了不必要的类型转换。

3. Java 泛型的使用

(1) 泛型类

泛型类是在类定义时指定一个或多个类型参数,以支持不同类型的数据。

示例
// 定义一个泛型类
class Box<T> {
    private T value;

    public void setValue(T value) {
        this.value = value;
    }

    public T getValue() {
        return value;
    }
}

// 使用泛型类
public class Main {
    public static void main(String[] args) {
        Box<Integer> intBox = new Box<>();
        intBox.setValue(10);
        System.out.println(intBox.getValue());  // 输出:10

        Box<String> strBox = new Box<>();
        strBox.setValue("Hello");
        System.out.println(strBox.getValue());  // 输出:Hello
    }
}

解释:

  • T 是类型参数,实例化 Box<Integer> 时,T 变为 Integer,实例化 Box<String> 时,T 变为 String。
  • setValue(T value) 只能接收 T 类型的数据,确保了类型安全。

(2) 泛型方法

泛型方法可以在方法级别使用泛型,而不需要整个类都是泛型的。

示例
class Util {
    // 泛型方法,`<T>` 指定泛型类型
    public static <T> void printArray(T[] array) {
        for (T element : array) {
            System.out.print(element + " ");
        }
        System.out.println();
    }
}

public class Main {
    public static void main(String[] args) {
        Integer[] intArray = {1, 2, 3, 4, 5};
        String[] strArray = {"A", "B", "C"};

        Util.printArray(intArray);  // 输出:1 2 3 4 5
        Util.printArray(strArray);  // 输出:A B C
    }
}

解释:

  • public static <T> void printArray(T[] array):<T> 说明该方法是泛型方法,可以接受不同类型的数组。

(3) 泛型接口

泛型接口允许接口的方法使用泛型,在实现时可以指定具体的类型。

示例
// 定义泛型接口
interface Generator<T> {
    T next();
}

// 实现泛型接口
class IntegerGenerator implements Generator<Integer> {
    private int value = 0;

    @Override
    public Integer next() {
        return value++;
    }
}

public class Main {
    public static void main(String[] args) {
        Generator<Integer> gen = new IntegerGenerator();
        System.out.println(gen.next());  // 输出:0
        System.out.println(gen.next());  // 输出:1
    }
}

解释:

  • Generator<T> 是一个泛型接口,IntegerGenerator 具体实现时指定 T 为 Integer。
  • next() 方法返回 Integer,符合泛型约束。

(4) 泛型的通配符

Java 提供 ? 作为泛型通配符,用于不确定具体类型的情况下,比如在方法参数中。

(a) ?(无界通配符)
public static void printList(List<?> list) {
    for (Object obj : list) {
        System.out.println(obj);
    }
}

  • List<?> 代表任意类型的 List,但是方法内部只能当作 Object 处理。
(b) ? extends T(上界通配符)
public static void printNumbers(List<? extends Number> list) {
    for (Number num : list) {
        System.out.println(num);
    }
}

  • List<? extends Number> 允许 List<Integer>、List<Double> 等作为参数,但不能添加新元素。
© ? super T(下界通配符)
public static void addNumber(List<? super Integer> list) {
    list.add(10); // 允许添加 Integer 或其父类
}

  • List<? super Integer> 允许 List<Integer>、List<Number> 或 List<Object> 作为参数。

(5) 泛型与类型擦除

Java 泛型是编译时特性,JVM 并不存储具体的泛型类型,所有泛型类型信息在编译后都会被类型擦除(Type Erasure)。

示例
List<String> list1 = new ArrayList<>();
List<Integer> list2 = new ArrayList<>();

System.out.println(list1.getClass() == list2.getClass());  // 输出:true

解释:

  • 在运行时,List<String> 和 List<Integer> 的类型信息都会被擦除,实际的 List<T> 变成 List<Object>,所以 list1 和 list2 具有相同的 Class。

4. 泛型的限制

Java 泛型有一些限制:

  1. 不能使用基本数据类型(必须使用包装类,如 List<int> 是非法的,应该用 List<Integer>)。
  2. 不能创建泛型数组(T[] array = new T[10] 会报错)。
  3. 不能在静态方法或静态变量中使用泛型类型参数(因为泛型类型参数是实例级的)。
  4. 不能直接实例化泛型类型(T obj = new T(); 是非法的,应该使用 Class<T> 来实例化)。

5. 总结

特性说明
泛型类class Box<T> { T value; }
泛型方法<T> void print(T item) {}
泛型接口interface Generator<T> { T next(); }
通配符?(无界)、? extends T(上界)、? super T(下界)
类型擦除编译后泛型信息会被擦除,变为 Object
限制不能使用基本类型、不能创建泛型数组、不能实例化泛型

Java开发的就业市场正在经历结构性调整,竞争日益激烈

传统纯业务开发岗位(如仅完成增删改查业务的后端工程师)的需求,特别是入门级岗位,正显著萎缩。随着企业技术需求升级,市场对Java人才的要求已从通用技能转向了更深入的领域经验(如云原生、微服务)或前沿的AI集成能力。这也导致岗位竞争加剧,在一、二线城市,求职者不仅面临技术内卷,还需应对学历与项目经验的高门槛。

大模型为核心的AI领域正展现出前所未有的就业热度与人才红利

2025年,AI相关新发岗位数量同比激增543%,单月增幅最高超过11倍,大模型算法工程师位居热门岗位前列。行业顶尖人才的供需严重失衡,议价能力极强,跳槽薪资涨幅可达30%-50%。值得注意的是,市场并非单纯青睐算法研究员,而是急需能将大模型能力落地于复杂业务系统的工程人才。这使得具备企业级架构思维和复杂系统整合经验的Java工程师,在向“Java+大模型”复合人才转型时拥有独特优势,成为企业竞相争夺的对象,其薪资天花板也远高于传统Java岗位。

在这里插入图片描述

说真的,这两年看着身边一个个搞Java、C++、前端、数据、架构的开始卷大模型,挺唏嘘的。大家最开始都是写接口、搞Spring Boot、连数据库、配Redis,稳稳当当过日子。

结果GPT、DeepSeek火了之后,整条线上的人都开始有点慌了,大家都在想:“我是不是要学大模型,不然这饭碗还能保多久?”

先给出最直接的答案:一定要把现有的技术和大模型结合起来,而不是抛弃你们现有技术!掌握AI能力的Java工程师比纯Java岗要吃香的多。

即使现在裁员、降薪、团队解散的比比皆是……但后续的趋势一定是AI应用落地!大模型方向才是实现职业升级、提升薪资待遇的绝佳机遇!

如何学习AGI大模型?

作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

2025最新版优快云大礼包:《AGI大模型学习资源包》免费分享**

一、2025最新大模型学习路线

一个明确的学习路线可以帮助新人了解从哪里开始,按照什么顺序学习,以及需要掌握哪些知识点。大模型领域涉及的知识点非常广泛,没有明确的学习路线可能会导致新人感到迷茫,不知道应该专注于哪些内容。

我们把学习路线分成L1到L4四个阶段,一步步带你从入门到进阶,从理论到实战。

L1级别:AI大模型时代的华丽登场

L1阶段:我们会去了解大模型的基础知识,以及大模型在各个行业的应用和分析;学习理解大模型的核心原理,关键技术,以及大模型应用场景;通过理论原理结合多个项目实战,从提示工程基础到提示工程进阶,掌握Prompt提示工程。

L2级别:AI大模型RAG应用开发工程

L2阶段是我们的AI大模型RAG应用开发工程,我们会去学习RAG检索增强生成:包括Naive RAG、Advanced-RAG以及RAG性能评估,还有GraphRAG在内的多个RAG热门项目的分析。

L3级别:大模型Agent应用架构进阶实践

L3阶段:大模型Agent应用架构进阶实现,我们会去学习LangChain、 LIamaIndex框架,也会学习到AutoGPT、 MetaGPT等多Agent系统,打造我们自己的Agent智能体;同时还可以学习到包括Coze、Dify在内的可视化工具的使用。

L4级别:大模型微调与私有化部署

L4阶段:大模型的微调和私有化部署,我们会更加深入的探讨Transformer架构,学习大模型的微调技术,利用DeepSpeed、Lamam Factory等工具快速进行模型微调;并通过Ollama、vLLM等推理部署框架,实现模型的快速部署。

整个大模型学习路线L1主要是对大模型的理论基础、生态以及提示词他的一个学习掌握;而L3 L4更多的是通过项目实战来掌握大模型的应用开发,针对以上大模型的学习路线我们也整理了对应的学习视频教程,和配套的学习资料。

二、大模型经典PDF书籍

书籍和学习文档资料是学习大模型过程中必不可少的,我们精选了一系列深入探讨大模型技术的书籍和学习文档,它们由领域内的顶尖专家撰写,内容全面、深入、详尽,为你学习大模型提供坚实的理论基础。(书籍含电子版PDF)

三、大模型视频教程

对于很多自学或者没有基础的同学来说,书籍这些纯文字类的学习教材会觉得比较晦涩难以理解,因此,我们提供了丰富的大模型视频教程,以动态、形象的方式展示技术概念,帮助你更快、更轻松地掌握核心知识。

四、大模型项目实战

学以致用 ,当你的理论知识积累到一定程度,就需要通过项目实战,在实际操作中检验和巩固你所学到的知识,同时为你找工作和职业发展打下坚实的基础。

五、大模型面试题

面试不仅是技术的较量,更需要充分的准备。

在你已经掌握了大模型技术之后,就需要开始准备面试,我们将提供精心整理的大模型面试题库,涵盖当前面试中可能遇到的各种技术问题,让你在面试中游刃有余。


因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

2025最新版优快云大礼包:《AGI大模型学习资源包》免费分享

sram设计流程+memory compiler整理 →。 阅读详情

相关推荐

双有源桥DC-DC变换器:原理、软开关与移相控制深度解析

隔离型DC-DC变换器是电力电子系统的核心部件,通过高频变压器实现电气隔离与电压匹配,保障系统安全与灵活适配。其工作原理基于功率半导体器件的开关动作,通过调制策略控制能量传输。该技术的核心价值在于实现高效、高功率密度的电能转换,并支持双向能量流动,这对于提升系统整体能效和运行灵活性至关重要。在新能源储能、电动汽车V2G及数据中心供电等场景中,双向能量流成为刚性需求,推动了如双有源桥等先进拓扑的应用。本文聚焦于双有源桥这一实现高效双向隔离变换的“明星”方案,深入剖析其利用移相控制实现软开关的机理。通过分析谐振

weixin_34195142的博客 379

Java 中的泛型(Generics)

特性说明泛型类泛型方法泛型接口通配符?(无界)、?extends T(上界)、?super T(下界)类型擦除编译后泛型信息会被擦除,变为Object限制不能使用基本类型、不能创建泛型数组、不能实例化泛型。

gyijh的博客 1729

深度学习基于Resnet18的图像多分类--训练自己的数据集(超详细 含源码)

深度学习基于Resnet18的图像多分类--训练自己的数据集(超详细 含源码)

她是不会无条件的!! 2万+

java基础-generics 泛型

Java泛型(generics)是JDK 5中引入的一个新特性,允许在定义类和接口的时候使用类型参数(type parameter)。声明的类型参数在使用时用具体的类型来替换。 这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 Java语言引入泛型的好处是安全简单。

bihansheng2010的博客 6976

如何使用Calibre PERC抽出 点到点/p2p 电阻

@[TOC](如何使用Calibre PERC抽点到点(p2p)电阻) 一、前言 需要实现的功能是从gds中抽出net的点到点的电阻。如下图这样。 二、准备工作 lvs rule pex rule(必要时可以自己定义RC rule) gds p2p点的坐标 定义prode.defs 因为p2p的点是变化的,所以每次prode定义都要重新出,对应的perc rule也是根据每个p2p点的定义来的,perc rule也是每次都要重新出。如果需要可以写一个脚本自动出这些定义文件。 PROBE_POINTS

kobayashiyou的博客 1万+

Autodesk全家桶怎么选?AutoCAD、Revit、Fusion 360等7款软件超全对比指南

本文深入对比了Autodesk旗下七款核心软件(AutoCAD、Revit、Inventor、Fusion 360、Maya、3ds Max、Forge)的核心定位与适用场景。针对建筑、制造、创意设计等不同专业需求,提供精准的选型指南,帮助用户根据自身工作流(如二维绘图、BIM协同、产品开发、影视动画)选择最匹配的工具,避免资源浪费并提升效率。

stone的博客 434

Java 入门指南:Java 泛型(generics)

泛型是Java中一种强大的特性,它允许我们编写类型安全且可重用的代码。通过使用泛型,我们可以创建灵活的组件,这些组件可以处理不同的数据类型,同时保持代码的简洁性和可读性。了解泛型的基本概念和高级用法对于编写高质量的Java程序至关重要。

热带鱼的技术博客 1266

全局子程序 参数调用

为什么要子程序: 为了实现程序结构化,我们尽量使用不同功能的功能块来实现一些特定的功能, 子程序接口: 使用过程的注意事项,尤其是数组使用时的注意事项 从一个主程序中可以将参数传递到局部或全局子程序和函数中。 怎样传递参数有 2 种方式: 作为 IN 参数 变量值在主程序中保持不变。 这种传递方式也称为“ 值传递 (Call by Value)”。 作为 OUT 参数 子程序读取并更改该值,然后将新值写回到主程序中。 这种传递方式也称为“Call by Reference”。 举例说明 1 DEF MY

Eric_Yang1024的博客 1095

Java泛型(Generics(

泛型(Generics)是 Java 中的一种特性,允许在类、接口和方法中定义类型和参数,从而实现参数的类型化。泛型的主要目的是提高代码的重用性和类型安全性。

qq_62123793的博客 1188

【AI应用实战-Codex】Mac intel芯片下安装Codex(二)

摘要:本文介绍了在Intel芯片Mac上安装OpenAI Codex桌面应用时遇到的问题及解决方法。由于官方仅提供ARM64版本,导致Intel Mac无法直接运行。解决方案包括:1)使用社区脚本将ARM版DMG与x64 Electron重新打包成兼容版本;2)使用VSCode插件配合CLI作为替代方案。文章详细记录了重新打包过程中遇到的"electron_common_owl_features"绑定缺失错误,通过注入stub代码、重算ASAR完整性哈希等步骤成功解决问题。最终生成的Co

3528

Qemu开发ARM篇-5、buildroot制作根文件系统并挂载启动

在上一篇中,我们编译了kernel,并在qemu上进行了运行,但到最后,在挂载根文件系统时候,挂载失败,这是因为我们还没有根文件系统,在本章中,我们将制作根文件系统。rootfs制作方式有很多方式,如busyBoxbuildrootYocto等,在该篇章中,我们使用buildroot来制作根文件系统,主要考虑到busyBox制作完还需要手动首改一些启动配置比较繁琐,而Yocto如果电脑配置不是很好,编译时间过长,比较麻烦。

sinat_33909696的博客 2465

Java Generics泛型 看这一篇就够了

Java使用擦拭法实现泛型,编译器内部永远把所有类型T视为Object处理 使用泛型 Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测非法的类型。泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。 泛型就是编写模板代码来适应任意类型 泛型的好处是使用时不必对类型进行强制转换,它通过编译器对类型进行检查 注意泛型的继承关系:可以把ArrayList向上转型为List(T不能变!),但不能把Li.

郎涯技术 1076

基于MATLAB/Simulink平台进行新能源微电网运行控制的建模与仿真

新能源微电网是现代电力系统的重要组成部分,能够有效整合分布式能源(如光伏、风力发电)和储能设备,实现局部区域内的能源高效利用。微电网的运行控制涉及多源能量管理、负荷平衡以及并网/孤岛模式切换等关键问题。基于MATLAB/Simulink平台进行新能源微电网运行控制的建模与仿真,可以帮助研究者验证控制策略的有效性,并优化系统的动态性能和经济性。本项目旨在构建一个完整的新能源微电网模型,包括电源模块、储能模块、负荷模块以及控制器模块,并通过仿真分析其运行特性。

xiaoheshang_123的博客 422

Java中的泛型 Generics

本文介绍了Java泛型的基本概念和使用方法。主要内容包括:1.泛型类的声明语法和使用示例;2.通过extends和super关键字实现有界限的泛型约束;3.泛型方法的定义方式;4.类型通配符?的使用场景;5.Java泛型底层实现原理——类型擦除机制,即编译时会将泛型类型转换为Object或指定的边界类型,运行时不会保留具体的类型参数信息。泛型通过类型擦除实现,既保证了类型安全,又不会产生运行时开销。

2301_79567474的博客 927

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Java:泛型(Generics)

Java:泛型(Generics)

听海边涛声 823

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Java 泛型 (Generics)

范型类、范型接口、范型方法

u014365523的博客 1238

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

java基础之泛型(Generics)

先抛几个问题: 什么是泛型?为什么需要泛型? 泛型如何使用?包括泛型类、泛型接口、泛型方法 带着这些问题我们一起去探究一下java的泛型 1. 什么是泛型 泛型的英文是Generics,翻译成泛型挺形象的,泛~不确定不固定的意思,指类型不确定,又叫参数化类型。类比于我们方法中会定义一个A类型的参数,现在是把A类型再进行提炼为一个通用的参数,在具体使用时才确定类型参数的具体类型 2. 为什么需要泛型 有两个类 ...

qingwangwang的博客 2234

【Java笔记】Generics 泛型

一些Java Generics的学习笔记

Hansdas的博客 1055

java-泛型(Generics)

Java中的泛型是一个强大的特性,能够增强代码的通用性和安全性。通过泛型,我们可以编写类型安全且更具可读性的代码,并且避免了繁琐的类型转换操作。尽管泛型在运行时会被类型擦除,但它在编译时提供的类型检查功能极大地减少了程序员犯错的机会。

Flying_Fish_roe的博客 805

Java 中的 Generics 泛型

Java 中的泛型学习笔记

天空之城的博客 533

Java 泛型(generics)

目录   概述 特性 通配符 泛型类 泛型接口 泛型方法 概述         Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。泛型在java中有很重要的地位,在面向对象编程及各种设计模式中有非常广泛的应用。         泛型的本质是为了参数化类型(在不创建新的类型的情况下,...

心有猛虎细嗅蔷薇 851

java generics(泛型)

泛型可以定义在类,接口和方法上。泛型使用 < >来指定泛型类型。如上,类变量flag在class定义时候指定为泛型,在对应使用泛型变量flag的地方都需要使用泛型进行接收和传递。

sinat_16493273的博客 941

Java泛型(Generics)

参考:http://docs.oracle.com/javase/tutorial/java/generics/index.html 为什么要使用泛型

navyhu的专栏 3528

Java泛型Generics

转载请标明出处: http://blog.youkuaiyun.com/wu_wxc/article/details/51493181 本文出自【吴孝城的优快云博客】 泛型泛型是JDK1.5中引入的一个新特性在尖括号中包含的是形式类型参数,可以在整个类的声明中被使用,当类被使用时,倒使用具体的实际类型参数来代替形式类型参数的命名:尽量使用单个大写字母普通泛型一个泛型类型package cn.wuxiao

吴孝城 4200

泛型(generics)

泛型

伏颜的博客 814

泛型(Generics)小结

1.为什么需要泛型? 1)使用集合时可能会发生安全的问题:可以向集合中放入任何类型 2)麻烦:从集合中获取元素,需要进行类型的强制转换 2.使用泛型:使用泛型方法,泛型类。 3.定义泛型 1)定义泛型:依照API定义——声明类(接口)时,在类名的后面,大括号的前面利用&amp;amp;amp;amp;amp;amp;lt;&amp;amp;amp;amp;amp;amp;gt;来声明泛型。在类中凡是可以使用类型的地方都可以使用类中声明的泛型。 public class Dao&amp

LCDZhao的艺术世界 1887
上一篇: java小游戏,零基础入门到精通,收藏这篇就够了
下一篇: 2026最新版Java面试八股文大全_八股文java面试题,零基础入门到精通,收藏这篇就够了
程序员_大白
博客等级 码龄5年 1万+粉丝 4001原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值