java zar_唬人的Java泛型并不难

泛型

public interfaceFoo {}

public interfaceBar {}

public interfaceZar> {}

上面的代码有什么区别?

泛型初探

1、为何引入泛型?

Java 泛型也是一种语法糖,使用泛型可以在代码编译阶段完成类型的转换,避免代码在运行时强制转换而出现ClassCastException的异常。

网络搜索出来一大堆的名称解释,我们先看英文Generic type,从英文大概也能明白,Generic 这里可以理解为普通的,一般的,或者我们可以说通用的。

其实可以理解为Java中的一种类型,通用类型。

Java从1.5的版本就开始支持泛型,不过很多小伙伴对泛型还是模凌两可,今天大概讲讲泛型,基础好的小伙伴,就当复习复习。

在1.5版本以前

publicstaticvoidmain(String[] args){

List list = new ArrayList();

list.add("兔子托尼啊");

list.add(1234);

//正常运行

System.out.println((String)list.get(0));

//❌运行时报错

System.out.println((String)list.get(1));

}

从上面的代码可以看出了,第一句打印不报错,第二句打印会报错的。

List默认是Object的类型的,向List里面存数据都是没有问题的,但是取数据的时候,必须要要进行类型的转换。

List集合get数据的时候并不清楚里面存放的什么数据类型,默认取出来的都是Object的类型,如果取数据的时候转换的类型和原始存放存的类型不一样,会报ClassCastException的异常。

2、引入了泛型

看代码

List list = new ArrayList();

list.add("兔子托尼啊");

//❌编译时错误

list.add(1234);

//不需要再进行转换了

String str = list.get(0);

3、泛型带来好处

这在编码的时候就给我们解决了,类型转换的问题,可以放心写代码。

取数据的时候再也不要考虑我前面存的什么类型,我应该转换为什么类型,不怕类型转换报错。

类型擦除

上面讲了泛型,泛型虽然带来了好处,但是泛型也带了一个问题叫做类型擦除。

什么是类型擦除?

Java的泛型是伪泛型,这是因为Java在编译期间,所有的泛型信息都会被擦掉,正确理解泛型概念的首要前提是理解类型擦除。

Java的泛型基本上都是在编译器这个层次上实现的,在生成的字节码中是不包含泛型中的类型信息的,使用泛型的时候加上类型参数,在编译器编译的时候会去掉,这个过程成为类型擦除。

classGenericU{

publicvoidfoo(){

System.out.println("GenericU.foo()");

}

}

public classOperater {

private T obj;

publicOperater(T obj){

this.obj = obj;

}

publicvoiddoIt(){

//❌报错,提示找不到foo方法

obj.foo();

}

publicstaticvoidmain(String[] args){

GenericU genericU  = newGenericU();

Operater operater = newOperater<>(genericU);

operater.doIt();

}

}

上面的代码就是因为泛型擦除,带来编译就报错了,代码中的obj不知道是什么类型?

正确的代码应该是什么,只要指定T的类型就好

classOperater2 {

private T obj;

publicOperater2(T obj){

this.obj = obj;

}

publicvoiddoIt(){

//正确☑️

obj.foo();

}

}

区分在Operater2和Operater

必须指定泛型的类型。

上面的例子是运用在类上面的,方法中是什么效果呢?

classFoo{

//定义泛型方法..

public voidshow(T t){

System.out.println(t);

}

}

调用方法

publicstaticvoidmain(String[] args){

//创建Foo对象

Foo foo = newFoo();

//不同的类型参数

foo.show("兔子托尼啊");

foo.show(1234);

foo.show(12.34);

}

通配符与上下界

我们大家在java的源码中肯定看到这样的例子。一个下限,一个上限

? extends T VS ? super T

? extends T - 这里的?表示类型T的任意子类型,包含类型T本身。

? super T - 这里的?表示类型T的任意父类型,包含类型T本身。

上限通配符 可以代表未知的T类型,或者通过关键字 extends 所继承的T类的任何一个子类。

同样,下限通配符 可以代表未知的T类型,或者通过关键字super出来的的T类的任何一个父类。

通配符和泛型方法

//通配符

publicvoidfoo1(List> list){

}

//使用泛型方法

public voidfoo2(List t){

}

问: 上面两种代码都是可以的,但是什么场合用那种呢?

如果当参数之间有依赖关系,或者返回的参数有依赖关系则用泛型,反之则用通配符。

问:关于 ? extends T 和 ? super T 什么场景下用呢?

我从网上搜索了下

当你需要从一个数据结构中获取数据时(get),那么就使用 ? extends T;如果你需要存储数据(put)到一个数据结构时,那么就使用 ? super T; 如果你又想存储数据,又想获取数据,那么就不要使用通配符 ? ,即直接使用具体泛型T。

最后

泛型大概就讲了上面的内容,你看明白了吗?希望你又学到了,每天学一点,进步一点。升职加薪就是你了。

码字不易,关注后送福利,求关注。

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

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

相关文章

团队作业7——Beta版本冲刺计划及安排

需要改进的工具流程&#xff08;如版本控制、测试工具等&#xff09; 首先把之前项目的BUG进行修复 然后完成如下的功能 冲刺的时间计划安排 &#xff08;冲刺时间为期七天&#xff0c;安排在2017.12.4——2017.12.10之间&#xff09; 组员任务陈福鹏实现博客.多语言、倒计…

开发黑名单功能demo_中台实践:通用化黑名单平台

业务中台的价值主要体现在对通用化业务能力的沉淀、整合&#xff0c;通过对可复用业务流程和业务功能的设计&#xff0c;向不同业务方提供标准化且可扩展的服务能力。本文来聊一聊笔者工作过程中设计的通用化黑名单平台&#xff0c;通过将用户管控能力的下沉&#xff0c;为各业…

java注解教程 pdf_Java注解详解

在使用SpringBoot作为Web敏捷开发的框架之后&#xff0c;SpringBoot除了自动装配配置的便捷之外&#xff0c;在很多时候需要基于注解来开发。注解不仅增加了代码的可读性&#xff0c;还增加了开发的速度。这篇文章主要讲述Java 注解。元注解元注解用于注解其他注解的。Java 5.0…

●BZOJ 1855 [Scoi2010]股票交易

题链&#xff1a; http://www.lydsy.com/JudgeOnline/problem.php?id1855 题解&#xff1a; DP,单调队列优化。&#xff08;好久没做 DP题&#xff0c;居然还意外地想出来了&#xff09; 定义 dp[i][k] 表示前 i天&#xff0c;手上还有 k股的最大收益。&#xff08;注意这个定…

java无权图求最短路径_求有权图和无权图的最短路径

无权图的最短路径思路&#xff1a;无权图的最短路径也就是要求两点之间最少几跳可达&#xff0c;那么我们可以这样&#xff0c;用广度遍历&#xff0c;从起点开始一层层遍历&#xff0c;如果第一次遍历到终点&#xff0c;那么肯定是最短路径。public static void findPath(int …

无限级分类及生成json数据

第一步,先去数据库查询类别数据,然后交给生成json数据的函数处理,代码如下: 1 /*生成类别JSON数据*/ 2 public function wirteJson(){ 3 $dataInfo \think\Db::query("select id as v,name as n,pid from think_pro_category"); 4 $data $this…

python游戏图像识别_利用python做图像识别

Python验证码识别处理实例(转)一、准备工作与代码实例1、PIL、pytesser、tesseract(1)安装PIL&#xff1a;下载地址&#xff1a;http://www.pythonware.com/products/pil/(CSDN下载)下载后是一个exe&#xff0c;直接双击安装&#xff0c;它会自动安装到C:\Python27\Lib\site-pa…

Java旅游动吧项目讲解_springboot动吧项目

架构分析页面流程业务分析&#xff1a;客户端向服务端发送一个请求&#xff0c;发向了Tomcat&#xff0c;如果Tomcat只有一个线程是不可能处理多个请求的&#xff0c;所以就需要一个多个线程的池资源&#xff0c;然后线程用I/O读取请求中的数据&#xff0c;然后服务器从http协议…

java并发-内存模型与volatile

JMM的关键技术点都是围绕着多线程的原子性、可见性和有序性来建立的。因此&#xff0c;我们首先必须了解这些概念 1&#xff0c;原子性 原子性是指一个操作是不可中断的。即使是在多个线程一起执行的时候&#xff0c;一个操作一旦开始&#xff0c;就不会被其他线程干扰&#xf…

python glob函数_python glob 模块 map函数

昨晚有了点小想法&#xff0c;想写个小脚本。用到了 glob 模块 和 map 函数 觉得他们配合起来和不错的。#coding:utf8import globprint "glob.golb 方法返回 " , glob.glob(r"/var/log/*.log")a glob.iglob(r"/var/log/*.log")print &qu…

数据分析师免费课程网址

分享一些免费的课程以下课程免费&#xff0c;讲师都是领域的专家&#xff0c;需要提前报名&#xff0c;请注意开班的时间。Coursera.org&#xff1a;统计学。Coursera.org&#xff1a;机器学习。Coursera.org&#xff1a;数据分析的计算方法。Coursera.org&#xff1a;大数据。…

微信机器人红包java_微信机器人_奇迹蛋_java实现

【实例简介】参考了别人的一些微信开发方法&#xff0c;自己实现了一个简单的微信机器人&#xff0c;部署在百度云上&#xff0c;能够点歌&#xff0c;查询天气&#xff0c;调教对话。可关注微信公众号&#xff1a;奇迹蛋。实现说明&#xff1a;http://blog.csdn.net/elcarim/a…

python增量赋值是什么意思_关于python中的增量赋值的理解

增量赋值运算符 和 * 的表现取决于它们的第一个操作对象 操作首先会尝试调用对象的 __ iadd__方法&#xff0c;如果没有该方法&#xff0c;那么尝试调用__add__方法&#xff0c;所以 与 的区别实质是__iadd__ 与 __add__的区别&#xff0c;同理&#xff0c;* 操作首先会尝试调…

Notepad++使用教程

Notepad 快捷键 大全CtrlC 复制CtrlX 剪切CtrlV 粘贴CtrlZ 撤消CtrlY 恢复CtrlA 全选CtrlF 键查找对话框启动CtrlH 查找/替换对话框CtrlD 复制并粘贴当行CtrlL 删除当前行CtrlT 当行向上移动一行F3 查找下一个ShiftF3 查找上一个CtrlShiftF 组合在文件中查找CtrlF3 查找&#x…

安卓手机刷软路由_华为路由AX3 Pro上手测评:用过最方便的路由器,没有之一...

都说"科技改变生活"&#xff0c;但我总觉着&#xff0c;现如今的人们似乎被数码产品"奴役"了。比如说&#xff1a;之前买过某品牌路由器&#xff0c;设置过程之繁琐&#xff0c;直接让当时是数码小白的我崩溃了。自打那之后&#xff0c;我选购数码产品的标…

ECharts.js学习(二)动态数据绑定

Echarts 数据绑定 简单的统计表已经可以生成&#xff0c;不过之前图标数据都是直接写在参数里面的&#xff0c;而实际使用中&#xff0c;我们的数据一般都是异步读取的。EChart.js对于数据异步读取这块提供了异步加载的方法。 绑定多组数据 很多时候需要展示的数据不单单是一组…

黑苹果2k屏_一加手机屏幕新特性:120Hz、2K+ OLED、10bit

在发布了旗下的首款概念手机Concept One后&#xff0c;再次有消息显示一加将在1月13日也就是今天举办“屏幕技术沟通会”。而在发布会正式到来前&#xff0c;一加CEO刘作虎则在微博表示&#xff0c;一加已经完成了120Hz屏幕的研发。沟通会上还会聊一聊一加90Hz 流体屏引领行业后…

popupmenu java_Java基于JPopupMenu实现系统托盘的弹出菜单,解决PopupMenu弹出菜单中文乱码...

本人萌新&#xff0c;利用业余时间学习Java。最近在写一个GUI程序的时候遇到一个问题&#xff0c;系统托盘创建弹出菜单中文乱码&#xff0c;网上搜索很多内容都没有找到解决方案&#xff0c;现将个人解决方案分享给大家&#xff0c;希望有所帮助一、PopupMenu存在的问题标准文…

QT获取主机名称

//获取主机名 QString localHost QHostInfo::localHostName(); 转载于:https://www.cnblogs.com/amwuau/p/8021758.html

Java哈利波特死亡圣器下_如果编程语言是《哈利波特》中的人物

如果编程语言是《哈利波特》中的人物&#xff0c;本文是作者的一些观点&#xff0c;如果你有不同的看法&#xff0c;欢迎在留言中告诉我们。C语言每个人都在说&#xff0c;C语言已经死了至少十年以上了。人们对它嗤之以鼻。当然它也曾不可一世&#xff0c;肆虐横行&#xff0c;…