JAVA之泛型

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

泛型的一般表达

ArrayList<String> files = new ArrayList<>();

public class Classname<T> //T:类型参数

定义一个带有参数类型的简单方法:

class ArrayAlg

{    

       public static <T> T getMiddle(T....a)

       {

                 return .......;

        }

}

注意:类型修饰符放在修饰符后面,返回类型前面。

调用这个方法的语句:

String middle = ArrayAlg.<String>getMiddle("John","Q","Public");//可以省略<String>.

类型变量的限定:public static <T extends ClassName> T Func(ArguType ......argu);

一个类型或通配符可以有多个限定,用&分开。

public class Pair<T>

{ private Object first;

private Object second;

public Pair(Object first,Object second)

{ this.first = first;

this.second = second;}

public Object getFirst(){return first;}

public Object getSecond(){return second;}

public void setFirst(Object newValue) {first = newValue;}

public void secSecond(Object newValue) {second = newValue;}

}

 

泛型代码和虚拟机

虚拟机没有泛型类型对象——所有对象都属于普通类。

类型擦除

擦除类型变量,并替换为限定类型,原始类型用第一个限定的类型变量来替换,无限定类型的变量就用Object替换。

当extends后有多个限定变量时,应该把标签接口放在尾部。标签接口:没有方法的接口。

翻译泛型表达式

 当程序调用泛型表达式,如果擦除返回类型,编译器插入强制类型转换。

例如:Pair<Employee> buddies = Pair(first,second);//这里的first和second必须是<>内的限定类型。即first = new Employee(...);

Employee body = buddies.getfirst();编译器把这个方法调用翻译为两条虚拟机指令:

1.对原始方法Pair.getFirst()的调用。

2.将返回的Object类型转换为Employee;

存取泛型域的时候也要插入强制类型转换,例如:Employee buddy = buddies.first;

翻译泛型方法:需要记住桥方法

个人理解:多态与擦除出现冲突,可以理解为子类重载了父类的一个方法,导致最后虚拟机不知道应该调用哪个方法(比如说,Employee 对象可以当作Object对象),然后使用合成桥方法类解决这个问题。(合成桥方法是虚拟机内部的机制,是由虚拟机自动完成的。)桥方法会使用父类的那个函数来调用子类的函数。

泛型的约束与局限性

不能用基本类型实例化类型参数。

例:Pair<double> 语法错误,只能用Pair<Double> (装箱)

运行时类型查询只适用于原始类型

不能创建参数化类型的数组

如果要收集参数化类型对象,只有一个安全而有效的方法:ArrayList<Pair<ClassName>>

Varargs警告

@safeVarargs

public static <T> void addAll(Collection<T>,T...ts)

这时可以提供泛型类型来调用这个方法。

不能实例化类型变量

new T[...],new T(....),T.class等都是错误的,因为T会擦除为Object。

不能构造泛型数组

泛型类的静态上下文中类型变量无效

不能抛出或者捕获泛型类的实例

甚至连泛型类扩展Throwable都不合法。例:public class Problem<T> extends Exception {.......}//ERROR

catch子句不能使用类型变量。即catch(T e)//ERROR

public static <T extends Throwable> void doWork(T t) throws T//OK

可以消除对受查异常的检查

注意擦除后的冲突

要想支持擦除的转换,就要强行限制一个类或类型变量不能同时成为两个接口类的子类,而这两个接口是同一接口的不同参数化。例:

class Employee implements Comparable<Employee> {......};

class Manager extends Employee implements Comparable<Manager>;

是不合法的,因为对于Manager对象来说,compareTo()方法有两个可以调用。

泛型的继承

无论S与T有什么关系,一般情况,Pair<T>,Pair<S>都不会有什么关系。泛型的继承和普通的继承基本相同,extends语句。

通配符类型

Pair<? extends ClassName> 表示任何泛型Pair类型,它的类型参数是ClassName的子类。//可以使用访问器,无法使用构造器.

Pair<? super ClassName> 表示类型参数是ClassName的所有超类型。//可以使用构造器,不能使用访问器。

带有超类型限定的通配符可以向泛型对象写入,带有子类限定的通配符可以从泛型对象中读取。

主要原因是:父类可以引用子类,但是子类不能引用父类。

无限定通配符 Pair<?>.类型Pair<?>有以下方法: ? getFirst(); void setFirst(?);

getFirst()的返回值只能赋给Object对象。setFirst不能被调用,甚至不能被Object调用。Pair<?>和Pair本质的不同在于:可以用任意Object对象调用原始Pair类的setFirst方法。注释:可以调用setFirst(null).例:

public static boolean hasNulls(Pair<?> p)

{return p.getFirst() == null || p.getSecond == null;}

注:引用子类的父类在调用之内与自己相同的方法时,使用的是自己的方法(前提是没有进行类型转换)。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

SYSU-MM01数据集评估避坑指南:从RGB/IR图像理解到Python评估脚本调优 本文详细解析了SYSU-MM01数据集在跨模态行人重识别(ReID)评估中的关键技巧与常见陷阱。从RGB/IR图像理解到Python评估脚本优化,提供了数据评估模式选择、single-shot/multi-shot差异分析、特征文件处理规范等实用指南,帮助研究者避开指标异常问题,提升评估效率与准确性。 阅读详情

相关推荐

基于单片机控制双向可控硅灯光强度设计

*单片机设计介绍,基于单片机控制双向可控硅灯光强度设计。

QQ2193276455的博客 2456

Java中的泛型全解析(一)

为什么我们需要泛型? 通过两段代码我们就可以知道为何我们需要泛型 实际开发中,经常有数值类型求和的需求,例如实现int类型的加法,有时候还需要实现long类型的求和,如果还需要double类型的求和,需要重新在重载一个输入是double类型的add方法。 定义了一个List类型的集合,先向其中加入了两个字符串类型的值,随后加入一个Integer类型的值。这是完全允许的,因为此时list默认的类型为Object类型。在之后的循环中,由于忘记了之前在list中也加入了Integer类型的值或其他...

记录工作日常 284

nRF52382低功耗蓝牙应用开发之入门教程-软件烧录

准备工作在上一篇文章讲过了,这里就讲讲nRFgo studio的使用 硬件准备: J-link:2线 供电:3.3V 如下图打开nRFgo studio界面介绍, 2、如果J-link正常,如下图 3、如果蓝牙芯片正常 4、烧录过程,如果蓝牙芯片之前有烧录过程序,需先点擦除,再点烧录 5、烧录代码路劲,例如 F:\nRF\SDK\nRF5_SDK_15.2.0_...

LinQiPing233的博客 1945

Java泛型详解 | 最新、全面、详细和深入 | 2万字超全

深度记录Java后端开发,对Java的泛型特性进行详细的整理并且分享,最新版,本文参考了Java泛型详解,JVM相关内容,以及其他博主的优秀思想和个人实战理解而成,希望对大家有帮助!!!

xwshappy的博客 3568

别再浪费HDRI了!D5渲染器环境光设置避坑指南(附天空球调试参数)

本文深入解析D5渲染器中HDRI环境光的高阶调试技巧,揭示90%渲染师常犯的错误认知。通过参数联动黄金法则、特殊材质应对方案及动态场景优化策略,帮助用户精准控制光子能量分布,实现建筑玻璃反射云层过渡等专业级效果。附赠天空球调试参数和商业项目验证案例,助您彻底释放HDRI潜力。

weixin_29216049的博客 494

Spacedesk保姆级教程:用旧平板给Windows电脑当副屏,从安装到避坑一步到位

本文提供Spacedesk保姆级教程,教你如何将旧平板变成Windows电脑的副屏,从软件安装到网络配置、显示优化及声音交互,一步步避开常见陷阱。通过WiFi实现扩展屏功能,支持4K分辨率和60Hz刷新率,让闲置设备焕发新生。

weixin_42524945的博客 1万+

【Java数据结构】泛型详解+图文,通配符上界、下界

无边界通配符 可以传入任意实参类型,不能写入,不能读取,只能输出。 public static void fun(Food

Original0的博客 3155

【思博伦】史上最详细Spirent TestCenter测试仪2544套件使用图文教程精讲!图解超赞超详细!!!

Avalanche测试仪使用指南 摘要:本文介绍了Avalanche测试仪的基本配置和使用方法。该测试仪采用Linux内核系统,通过端口模拟客户端与服务器端,支持HTTP、DNS、FTP等多种协议。文章详细讲解了管理IP配置、端口占用、项目创建、客户端/服务器端的参数设置(包括负载模拟、行为配置、网段设置等),以及测试执行和结果查看的全流程。特别针对HTTP测试,说明了测试前的组网准备和注意事项,包括IP地址规划、License申请等。同时提供了2544套件的时延和吞吐量测试方法,包括参数配置技巧和结果分析

风云说通信 2268

泛型

泛型是JDK1.5的新特性,类似于C++中的模板,但是仅限于表面。Java中的泛型只是在编译器中实现,用于编译时类型检查,编译后,生成普通的非泛型字节码,这种实现技术成为erasure“擦除”,Java之所以只在编译时实现,是因为若运行时支持泛型,需要拓展虚拟机指令集,工作量庞大,并且使Java厂商升级其JVM造成很大困难。 术语: 1.  ArrayList    泛型类型,其中E称为泛

fengxiaotao_cool的专栏 392

如何成为一名高级数字 IC 设计工程师(6-7)数字 IC 验证篇:DEBUG 技巧

不懂验证的设计不是好的设计;UVM 验证思维是指导缜密的芯片设计的导师;推荐书籍《芯片验证漫游指南》。

新芯设计的博客 1604

Qt实现窗口等比例缩放

在Qt中,实现窗口的等比例缩放是一个常见的需求。通过对窗口的尺寸进行调整,使得窗口的内容在缩放过程中保持相同的比例,可以提供更好的用户体验。通过以上的代码,我们实现了一个可以等比例缩放的Qt窗口。在调整窗口大小时,窗口中的标签和按钮将按比例缩放,保持内容的比例不变。首先,我们需要在Qt中创建一个窗口,并设置其内容。在该事件中,我们将根据窗口的新尺寸计算出合适的比例因子,并将其应用到窗口的内容上。现在,我们将添加功能,使得窗口可以等比例缩放。最后,我们将缩放因子应用到窗口中的标签和按钮上,调整它们的尺寸。

2301_79330511的博客 3958

java核心基础之泛型

为什么要使用泛型 大家好,我是 jack xu,今天给大家讲的是 java 核心基础的第二篇,泛型,这个东西熟悉又陌生,熟悉是相信大家每天都在用,List< Long>这个就是泛型,陌生是泛型还有一些其他偏门冷门的知识,今天给大家查漏补缺一下。不喜勿喷,高手也可以略过,先看下面一段代码: 这段代码把 Integer 和 String 类型的数据都塞进去,然后打印出来,list 默认是可以存放任意类型的数据,代码是没毛病的,运行一下 报错了,Integer 不能转成 String 类型的,为了

a779868946的博客 365

大疆 2021 嵌入式笔试题

在深圳做嵌入式,大疆公司绝对是 Top 级别的,大疆的技术栈也很深。

qq_38769551的博客 2495

Java之泛型

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

Beyondczn的博客 9373

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Java泛型详解:Java泛型集合、泛型类、泛型方法、泛型的使用

在 Java 1.5 之前没有泛型,通常需要使用强制类型转换的方式将一种数据类型转换为另一种数据类型,这种转换要求开发者对实际参数的类型具有可预知性。对于强制类型转换错误的情况,编译器可能不会提示错误,但是在运行时会出现异常,这是一个安全隐患。 为了解决这一隐患,从 Java 1.5 开始提供了泛型。泛型可以在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高了代码的重用率。本节将详...

jijiangpeng的博客 7432

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Java泛型——为何要有泛型

对于String类类型来说,它是继承自Object的,而Integer的直接父类是Number,因此会有Integer无法转String的错误。泛型类是在实例化类的时候指明泛型的具体类型,那么泛型方法就是在调用方法时指明泛型的具体类型。在实现传入泛型实参的泛型接口的实现类定义中,实现类即使不声明泛型,也不会编译错误。在实现未传入泛型实参的泛型接口的实现类定义中,实现类要声明泛型,否则会编译错误。为了避免这样可能的错误,引入泛型,使编译器在编译阶段就提示不匹配的类类型。方法返回了一个更加特定的返回类型。

xiaovie的博客 1719

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

java泛型——泛型类、泛型方法、泛型接口

泛型Java 泛型Java 泛型是什么泛型类泛型类的格式泛型类举例泛型方法泛型方法的格式泛型方法举例泛型接口泛型接口的格式泛型接口举例 Java 泛型 Java 泛型是什么 官方定义: 泛型是Java SE 1.5的新特性,泛型的本质就是参数化类型,也就是说所操作的数据类型被指定为一个参数 这种参数类型可以用在类、接口和方法的创建中,分别成为泛型类、泛型接口、泛型方法 优缺点: ​ 优点:可以不用再类型转换了 ​ 缺点:降低了代码的可读性 泛型类 泛型类:当一个类要操作的引用数据类型不确定的时候,可

一个小小的码农 6583

Java泛型

是同时存在的,可是如果是常规的两个方法,他们的方法签名是一样的,也就是说虚拟机根本不能分别这两个方法。如果是我们自己编写Java代码,这样的代码是无法通过编译器的检查的,但是虚拟机却是允许这样做的,因为虚拟机通过参数类型和返回类型来确定一个方法,所以编译器为了实现泛型的多态允许自己做这个看起来“不合法”的事情,然后交给虚拟器去区别。如果是重载,那么子类中两个setValue方法,一个是参数Object类型,一个是Date类型,可是我们发现,根本就没有这样的一个子类继承自父类的Object类型参数的方法。

YLXCA的博客 1315

【 java 泛型】详解java泛型

java泛型可以提高java程序的类型安全,提高程序的可靠性,并且在开发中也较常用,因此还是要简单学习一下!

阿牛的博客 2069

Java泛型的其他应用——泛型接口、泛型方法、泛型数组以及泛型的嵌套设置

学习目标 掌握泛型接口的使用 掌握泛型方法的定义的及使用 掌握泛型数组的使用 掌握泛型的嵌套设置 之前所有的操作都是在类中直接使用泛型操作的,那么,对于Java来说,也可以直接在接口中定义及使用泛型。 定义泛型接口 在JDK1.5之后,不仅仅可以声明泛型类,也可以声明泛型接口,声明泛型接口和声明泛型类的语法类似,也是在接口名称后面加上,如下格式所示: [访问权限]

1万+

java 泛型详解(普通泛型、 通配符、 泛型接口,泛型数组,泛型方法

Java代码Java代码Java代码Java代码Java代码Java代码Java代码。

2401_84619530的博客 1514

Java 泛型

Java 泛型 Java 泛型(generics)是 JDK 5 中引入的一个新特性,泛型提供了编译时类型安全检测机制,该机制允许程序在编译时检测到非法的类型。 泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。泛型信息不会进入到运行时阶段。编译器有效 泛型的三种方式:泛型类、泛型接口、泛型方法 泛型类 定义格式: 修饰符 class 类名<代表泛型的变量> { } 例如,API中的ArrayList集合: class ArrayList<E>{ p

JustToFaith 2955

java泛型

文章目录1. 泛型简述2. 泛型类别2.1 泛型类2.1.1 某种实际类型,重用性不好,Holder只能拥有A类型2.1.2 Object类型,类型太泛,可以容纳所有类型2.1.3 在创建的时候可以指定只可以容纳某种类型,此后只能容纳这种类型注意:基础类型无法作为类型参数,其封装类型可以2.2 泛型接口2.3 泛型方法3. 泛型擦除3.1 泛型只在编译期有效3.2 泛型内部无法获得泛型参数的有关信...

登峰小蚁 3065

Java之泛型,什么是泛型?为什么用泛型?(泛型详解)

1.为什么会有泛型呢? 早期的Object类型可以接受任意的对象类型,但是在实际使用中,会有类型转化的问题,存在隐患,所以Java提供泛型解决这个安全问题 2.什么是泛型? 泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类...

围巢 3969

Java【泛型】

Java的泛型说明

在下的博客 1467

java 泛型的默认值_java泛型

1.什么是泛型泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。泛型:泛型类 泛型接口 泛型方法作用:提高程序健壮性,简化代码泛型的默认值是Objectjdk 要1.5以上2.泛型定义/***泛型类*首先定义一个person的实体类 Person其中A代表的就是一个泛型,调用时可以自定义数据类型*/package com.temp;public class Per...

weixin_34246474的博客 1833
上一篇: JAVA之多线程程序设计
Linux修炼
博客等级 码龄9年 0粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值