Java中的泛型

Java中的泛型是什么?它有什么作用? 在类、接口或方法声明中使用的特殊类型变量,用于指定类或方法所操作的对象类型。:在泛型代码中,类型参数会在编译时进行检查,以确保类型的安全性。还允许你声明带有多个类型参数的泛型类、接口和方法,只需在尖括号中用逗号分隔多个类型参数即可。这些类型参数在实例化时会被具体的类型所替换,从而实现了代码的重用和类型安全。中的泛型是一个强大的工具,它允许你编写更加灵活、可重用、类型安全和易于阅读的代码。泛型方法是在方法声明时通过类型参数指定方法中操作的对象的类型。在方法体内部,你可以像使用普通类型一样使用类型参数。 阅读详情

一、泛型类

(1)泛型类的定义语法

class 类名称 <泛型标识,泛型标识,...> {
    private 泛型标识 变量名;
    ......
    }

(2)常用的泛型标识:T、E、K、V

/**
 * @author xujin
 * @createtime 2021-02-14 14:29
 * @description
 * 泛型类的定义
 * <T>泛型标识-类型参数
 * 创建对象的时候指定具体的数据类型
 * 注意:
 * (1)泛型类在创建对象的时候,没有指定类型,将按照Object类型来操作
 * (2)泛型类的类型参数只能是类类型,不能是基本数据类型
 * (3)泛型类型在逻辑上可以看成是多个不同的类型,但其Class类型实际上都是相同类类型
 */

public class Generic<T> {
    private T value;

    public Generic(T value) {
        this.value = value;
    }
    public T getValue() {
        return value;
    }

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

二、泛型类派生子类

(1)子类也是泛型类,子类和父类的泛型类型要一致

class ChildGeneric<T> extends Generic<T>
public class Parent<T> {
    private T value;

    public T getValue() {
        return value;
    }

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

如果不声明父类的泛型,那么父类默认就是Object类型,如下:

public class ChildFirst<T> extends Parent {
    @Override
    public Object getValue() {
        return super.getValue();
    }
}

这是由于如果子类的泛型类型和父类的泛型类型不同的话,在调用子类的构造方法的时候就会报错,因为调用子类的构造方法里面会调用父类的构造方法,正确如下:

public class ChildFirst<T> extends Parent<T> {
    @Override
    public T getValue() {
        return super.getValue();
    }
}

也可以进行如下写法,但是要保证子类的泛型列表中要有一个泛型类型和父类一致,如下:

public class ChildFirst<T,E,K,V> extends Parent<T> {
    @Override
    public T getValue() {
        return super.getValue();
    }
}

(2)子类不是泛型类,父类要明确泛型的数据类型

class ChildGeneric extends Generic<String>
public class ChildSecond extends Parent<Integer> {
    @Override
    public Integer getValue() {
        return super.getValue();
    }
}

三、泛型接口

(1)泛型接口的定义语法

interface 接口名称<泛型标识,泛型标识,...> {
    泛型标识 方法名();
    ......
}

(2)实现类不是泛型类,接口要明确数据类型

(3)实现类也是泛型类,实现类和接口的泛型类型要一致。

四、泛型方法

(1)语法

修饰符 <T,E,...> 返回值类型 方法名(形参数列表){
 方法体...
}

(2)public与返回值中间的泛型列表非常重要,可以理解为声明此方法为泛型方法

(3)只有声明了泛型列表的方法才是泛型方法,泛型类中的使用了泛型的成员方法并不是泛型方法

(4)泛型列表表明该方法将使用泛型类型T,此时才可以在方法中使用泛型类型T

(5)与泛型类的定义一样,此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型

public class GenericMethod {
    public static <E> E genericMethod(E value) {
        return value;
    }
}

(2)泛型方法与可变参数

public <E> void print(E... e) {
    for(E e1:e) {
        System.out.println(e);
    }
}
public static <E> void print(E... e) {
        for (int i = 0; i < e.length; i++) {
            System.out.println(e[i]);
        }
    }

(3)泛型方法总结
1)泛型方法能使方法独立与类而产生变化
2)如果static方法要使用泛型能力,就必须使使其成为泛型方法

五、类型通配符

(1)什么是类型通配符
1)类型通配符一般是使用“?”代替具体的类型实参
2)所以,类型通配符是类型实参。而不是类型形参

public class Box<E> {
    private E value;

    public E getValue() {
        return value;
    }

    public void setValue(E value) {
        this.value = value;
    }
    public static void showBox(Box<?> box) {
        Object value = box.getValue();
    }
}

(2)类型通配符的上限
语法:

类/接口<? extends 实参类型>

要求该泛型的类型,只能是实参类型,或实参类型的子类类型

public static void showBox(Box<? extends Number> box) {
        Number value = box.getValue();
    }

有类型通配符上限的集合是不能添加元素的
在这里插入图片描述

(3)类型通配符的下限
语法:

类/接口<? super 实参类型>

要求该泛型的类型,只能是实参类型,或实参类型的父类类型

public static void showBox(Box<? super Number> box) {
        Object value = box.getValue();
    }

而有类型通配符下限的集合是能添加元素的,但不能保证数据的正确性
在这里插入图片描述

六、类型擦除

  泛型是Java1.5版本才引进的概念,在这之前是没有泛型的,但是,泛型代码能够很好地和之前版本的代码兼容。那是因为,泛型信息只存在于代码编译阶段,在进入JVM之前,于泛型相关的信息会被擦除掉,我们称为--类型擦除

(1)无限制类型擦除
在这里插入图片描述

public class Erasure<T> {
    private T value;

    public T getValue() {
        return value;
    }

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

泛型发生在生产字节码文件的时候,我们用反射来看一下字节码文件中value是什么类型的:

public class Test {
    public static void main(String[] args) {
        Erasure<Integer> erasure = new Erasure<>();
        Class<? extends Erasure> erasureClass = erasure.getClass();
        Field[] declaredFields = erasureClass.getDeclaredFields();
        for (Field declaredField : declaredFields) {
            System.out.println(declaredField.getName()+":"+declaredField.getType().getSimpleName());
        }
    }
}

运行结果如下:
在这里插入图片描述
(2)有限制的类型擦除
在这里插入图片描述

public class Erasure<T extends Number> {
    private T value;

    public T getValue() {
        return value;
    }

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

运行结果:
在这里插入图片描述

七、泛型与数组

(1)可以声明带泛型的数组引用,但是不能直接创建带泛型的数组对象,这是因为泛型是在编译器做类型擦除,而数组会在整个编译器去持有相应的数据类型:
在这里插入图片描述
不过可以这样创建:
在这里插入图片描述

(2)可以通过java.lang.reflect.Array的newInstance(Class, int)创建(泛型)T[]数组

public class Fruit<T> {
    private T[] array;

    public Fruit(Class<T> clz, int size) {
        array = (T[]) Array.newInstance(clz, size);
    }

}

【泛型】Java中的泛型,泛型类,泛型接口,泛型方法,泛型擦除 这篇文章总结一下Java中的泛型相关知识点,包括:泛型概念、泛型优缺点、泛型通配符、泛型上下界、泛型使用(泛型类、泛型接口、泛型方法)、泛型擦除等内容。 一、泛型概念 (1)什么是泛型 什么是泛型??? 泛型(Generic),是一种参数化数据类型,它允许我们在编写程序代码的时候不用具体指定需要什么数据类型,而是等到具体使用的时候,将数据类型以参数的形式传递给程序,这就是泛型程序设计。 (2)为什么需要泛型 我们来看看下面这个栗子 假设现在有个需求,通过集合保存元素,需要保存String字 阅读详情

相关推荐

关于RTP时间戳以及播放器对时间戳的处理

首先,了解时间戳几个基本概念: 时间戳单位:时间戳计算的单位不是秒之类的单位,而是由采样频率所代替的单位,这样做的目的就是为了是时间戳单位更为精准。比如说一个音频的采样频率为8000Hz,那么我们可以把时间戳单位设为1 / 8000。 时间戳增量:相邻两帧之间的时间差(以时间戳单位为基准)。 采样频率: 有些地方也叫时钟频率,即 每秒钟抽取样本的次数,例如音频的采...

toshiba689的专栏 3052

java中的泛型(通过泛型实现多类型的抽奖机),对象成员变量赋值的优先级

一、什么是泛型 1.背景: JAVA推出泛型以前,程序员可以构建一个元素类型为Object的集合,该集合能够存储任意的数据类型对象,而在使用该集合的过程中,需要程序员明确知道存储每个元素的数据类型,否则很容易引发ClassCastException异常。(例如4.理解里的list,遍历时就会出现强制类型转换,出现错误) 2.概念: Java泛型(generics)是JDK5中引入的一个新特性,泛型提供了编译时类型安全监测机制,该机制允许我们在编译时检测到非法的类型数据结构。泛型的本质就是参数化类型,也就是所

weixin_44893467的博客 686

GT911触摸驱动避坑指南:从寄存器读取到多点触控处理的5个关键步骤详解

本文深入解析了GT911触摸驱动开发中的关键步骤与常见问题。从硬件初始化、I2C通信建立,到核心寄存器操作、缓冲区状态管理,再到配置表烧录与多点触控数据解析,提供了详尽的避坑指南。文章结合STM32等平台的实战代码,重点阐述了驱动调试中的时序、中断处理和坐标映射等核心要点,帮助开发者高效实现稳定可靠的多点触控功能。

weixin_29189363的博客 676

java静态方法使用泛型

ps:以上都属于泛型的用法,把static去掉也同样可用。

begefefsef的博客 1320

各种AI的调试日记——辅助工作篇

记录使用各种AI(语言大模型)的心得和总结

m0_73056986的博客 1392

金属粘结剂喷射3D打印技术:工艺流程与后处理关键

金属粘结剂喷射(Binder Jetting)是一种创新的增材制造技术,通过逐层喷射粘合剂将金属粉末粘结成型,再经过脱脂和烧结等后处理工序获得最终零件。这项技术的核心优势在于无需支撑结构、可实现批量生产,并且材料利用率高。在3D打印领域,金属BJ技术特别适合中小尺寸、结构复杂且表面质量要求高的零件生产。其工艺流程包括前期数据处理、打印生胚阶段、拆包与清粉,以及关键的渗透、脱脂和烧结后处理环节。后处理工艺的控制直接决定了零件的机械性能和尺寸精度,其中烧结工艺尤为关键,需要精确控制温度曲线和气氛环境。金属BJ打

weixin_35751194的博客 86

Java基础泛型Static方法

package pkg;/** * Created by sanmao on 2016/6/29. */ public class Static { /** * 从上篇讲带有限制通配符的博客,我们看到totalArea方法是泛型方法,因为它能够接收不同的参数 * 但是这里没有特定类型的参数表,正如 GenericMeoryCell类的声明中所作的那样,有时候特定类型很重

路漫漫其修远兮,吾将上下而求索 4267

STM32G0实战:手把手教你用国产GD25Q16 Flash存储传感器数据(附完整驱动)

本文详细介绍了如何使用国产GD25Q16 Flash芯片与STM32G0系列MCU实现传感器数据存储的完整方案。从SPI接口配置、驱动层实现到存储系统架构设计,提供了实战代码和优化策略,帮助开发者快速构建高性价比的物联网数据存储系统。

weixin_30733003的博客 107

java 泛型<E>类 简解

创建ArrayList类时不理解ArrayList&amp;amp;lt;E&amp;amp;gt;中E的内部原理?刚开始读源码时public class ArrayList&amp;amp;lt;E&amp;amp;gt;

nayi_224的博客 3993

【STM32】H743的25MHZ外部晶振下480MHz时钟的CubeMX配置图

备忘 有时候临时调一个外设做实验需要快速搭建工程的时候,老忘记配置的数据 再补一段代码格式的 void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; /** Supply configuration up

一只爱做笔记的码农 3395

MyBatis-Plus 实战:敏感字段自动加解密支持模糊查询

本文基于MyBatis-Plus框架提出了一种全链路敏感字段加密方案。通过自定义TypeHandler实现数据入库自动加密和查询自动解密,结合重写LambdaQueryWrapper处理查询条件加密,并适配多种查询方式。方案核心包括:1)AESUtil工具类提供加解密基础能力;2)EncryptTypeHandler实现字段类型转换;3)实体类通过注解配置加密字段。该方案在保证数据安全的同时,对业务代码侵入性小,支持姓名、手机号等敏感信息的全流程加密处理,满足系统开发的安全需求。

蔡定努 596

java中的泛型(二)——泛型接口以及泛型方法

本文简要介绍了泛型接口以及泛型方法的使用

qq_59750520的博客 4701

【Dumper-7】入门指南 - 带你领略不一样的UE世界

摘要: Dumper-7是一款用于分析UE4/UE5游戏的逆向工具,可自动生成游戏内部结构的C++ SDK。支持Visual Studio、CMake和Xmake三种构建方式,通过DLL注入目标游戏后,自动识别引擎结构并输出C++ SDK文件(默认保存在C:\Dumper-7目录)。该工具适用于游戏Mod开发、安全研究和机制分析,提供完整的类层次映射、属性/函数识别功能。使用时需注意x64平台配置,生成SDK后可集成到自定义DLL项目中,通过示例代码展示如何查找游戏对象、访问世界状态和调用引擎函数。

kinghzking的专栏 437

详解Java中的泛型(泛型的语法,擦除机制,泛型的上界)

泛型(Generics)是Java SE 5中引入的一个新特性,可以使Java中的类和方法具有更广泛的类型范围。通俗的说,它使得我们可以在定义类和方法时指定一个或多个类型参数,从而可以在不考虑具体类型的情况下,代码中直接使用这些类型参数。泛型可以增强代码的安全性、可读性和可重用性。例如,可以使用泛型实现容器类(如ArrayList、HashMap)等。在使用泛型时,需要在编写代码时指定泛型类型,这样可以在编译期间检查代码的类型安全性。

luming的博客 6356

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

[JAVA]什么是泛型?泛型在Java中的应用

所谓泛型,就是允许在定义类、接口时通过一个标识表示类中某个属性的类型或者是某个方法的返回值及参数类型

2301_79757798的博客 1613

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

【Java 基础语法】详解 Java 中的泛型

前言: 泛型的知识其实在前面 Java 的泛型和包装类 这章介绍过了一些,但那些知识是为后面介绍 Java 集合框架做的铺垫,而今天这章再配合之前那章,将会完整的介绍 Java 中的泛型! 文章目录1. 前章回顾1.1 泛型类的代码示例1.2 泛型类的意义1.3 泛型是如何编译的2. 泛型类的定义2.1 语法2.2 示例3. 内部类3.1 概念3.2 实例内部类3.3 静态内部类3.4 匿名内部类4. 泛型类的使用4.1 语法4.2 示例4.3 类型推导(Type Inference)5. 裸类型(Ra

吞吞吐吐大魔王的博客 3459

java中的泛型是什么_Java中泛型是什么?Java泛型的详细介绍

本篇文章给大家带来的内容是关于Java中泛型是什么?Java泛型的详细介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。一、什么是泛型?Java泛型设计原则:只要在编译时期没有出现警告,那么运行时期就不会出现ClassCastException异常.泛型:把类型明确的工作推迟到创建对象或调用方法的时候才去明确的特殊的类型参数化类型:ArrayList中的E称为类型参数变量Arra...

weixin_29174013的博客 3474

Java中的泛型详解

泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率。泛型方法是Java中一种特殊的方法,它在声明时可以使用泛型类型参数,使得方法在调用时可以接受不同类型的参数,并且能够保证类型安全。需要注意的是,泛型在Java中是通过类型擦除来实现的,这意味着泛型信息只在编译时存在,而在运行时会被擦除。在Java中,泛型是一种强大的编程特性,允许类、接口和方法在定义时声明一种参数化类型,而在使用时可以指定具体的类型参数。在编译时,泛型类型被擦除,实际操作的对象是原始类型。

努力分享一些干货 1599

JAVA中的泛型

泛型:就是适用于许多许多类型。从代码上讲,就是对类型实现了参数化。 泛型的语法: class 泛型类名称 { } class ClassName { } 类名后的 代表占位符,表示当前类是一个泛型类。 类型形参一般使用一个大写字母表示,常用的名称有: E 表示 Element K 表示 Key V 表示 Value N 表示 Number T 表示 Type S, U, V 等等 - 第二、第三、第四个类型

2302_76339343的博客 1487

Java 中的泛型详解

泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参列表,普通方法的形参列表中,每个形参的数据类型是确定的,而变量是一个参数。在调用普通方法时需要传入对应形参数据类型的变量(实参),若传入的实参与形参定义的数据类型不匹配,则会报错。那参数化类型是什么?以方法的定义为例,在方法定义时,将方法签名中的形参的数据类型也设置为参数(也可称之为类型参数),在调用该方法时再从外部传入一个具体的数据类型和变量。

XuChaofafa的博客 1704

【Java】Java中的泛型

在Java中,泛型是一种在编译时期类型检查的机制,它使得我们能够创建具有通用行为的类、接口和方法,以适应不同类型的数据。通过使用泛型,可以提高代码的复用性、类型安全性以及可读性。 泛型是在JDK 1.5 引入的新语法,通俗来讲,泛型就是适应多种类型。从代码上来看,就是对类型实现了参数化,即从传入的类型参数来确定数据的具体类型。

qq_61635026的博客 2430

Java中的泛型是什么?

Java泛型是一种强大的工具,它通过参数化类型的方式,使得代码更加灵活、类型安全,并且提高了代码的重用性和可读性。理解泛型的基本概念、优点、使用方式和限制,对于编写高质量的Java代码至关重要。在Java中,泛型方法的定义和调用是通过类型参数来实现的。泛型方法允许在方法级别上指定一个或多个类型参数,使得该方法可以在不同类型的上下文中重用,从而提升代码的复用性和类型安全性。定义泛型方法时,需要在方法声明中使用类型参数(例如T或E这些类型参数可以用于限制方法参数或返回值的类型。// 方法体在这个例子中,

破损的天堂鸟博客 1194
上一篇: JAVA中对象在内存中的布局及Object o = new Object()在内存中占了多少字节
下一篇: CAS(compare and swap)详解,追溯到HOTSPOT源码
suixinghero
博客等级 码龄7年 10粉丝 58原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值