Java学习总结:21
泛型
泛型的引出
例:向下转型的错误示范
package Project.Study.Genericity;class Point{ //定义坐标类private Object x; //可以保存任意数据private Object y; //可以保存任意数据public Object getX() {return x;}public Object getY() {return y;}public void setX(Object x) {this.x = x;}public void setY(Object y) {this.y = y;}
}
public class Test {public static void main(String args[]){Point p=new Point(); //实例化Point类数据p.setX("东经100度"); //设置坐标数据p.setY(10); //设置坐标数据System.out.println("x坐标:"+p.getX()+"y坐标"+p.getY());//根据设置好的坐标取出数据进行操作String x=(String)p.getX(); //取出坐标数据String y=(String)p.getY(); //取出坐标数据System.out.println("x坐标:"+x+"y坐标"+y);}
}
//结果
//Exception in thread "main" java.lang.ClassCastException: class //java.lang.Integer cannot be cast to class java.lang.String //(java.lang.Integer and java.lang.String are in module java.base of //loader 'bootstrap')
// at Project.Study.Genericity.Test.main(Test.java:30)
//x坐标:东经100度y坐标10
例:使用泛型减少转型操作
package Project.Study.Genericity;
//此时的T在Point类定义上只表示一个标记,在使用时需要为其设置具体的类型
class Point<T>{ private T x; //此属性的类型不知道,由Point类使用时的动态决定private T y; //此属性的类型不知道,由Point类使用时的动态决定public T getX() {return x;}public T getY() {return y;}public void setX(T x) {this.x = x;}public void setY(T y) {this.y = y;}
}
public class Test {public static void main(String args[]){Point<String> p=new Point<String>(); //实例化Point类数据,设置泛型为Stringp.setX("东经100度");p.setY("北纬20度");System.out.println("x坐标:"+p.getX()+"y坐标"+p.getY());String x=p.getX(); //取出坐标数据,不再需要强制类型转换String y=p.getY(); 取出坐标数据,不再需要强制类型转换System.out.println("x坐标:"+x+"y坐标"+y);}
}
//结果
//x坐标:东经100度y坐标10
//x坐标:东经100度y坐标10
提示:一个类中可以定义多个泛型标记。
class Point<P,R>{public R fun(P p){return null;}
}
需要注意的是,如果要想使用泛型,那么它能够采用的类型只能够是类,即不能是基本类型,只能是引用类型。
通配符
例:通配符"?"的使用
package Project.Study.Genericity;class Message<T>{private T msg;public void setMsg(T msg){this.msg=msg;}public T getMsg() {return msg;}
}
public class Test1 {public static void main(String args[]){Message<Integer>message1=new Message<>();Message<String>message2=new Message<>();message1.setMsg(30);message2.setMsg("Hello World");fun1(message1); //引用传递fun2(message2);}public static void fun1(Message<?> temp){ //不能设置,但是可以取出System.out.println(temp.getMsg());}public static void fun2(Message temp){ //默认使用Object作为泛型类型,可以在方法中随意修改对象内容(即使类型不符合),这种做法是不严谨的temp.setMsg(100);System.out.println(temp.getMsg());}
}
//结果
//30
//100
由上fun2(),必须使用通配符"?"来制约这种任意修改数据问题的操作。所以"?"设置的泛型类型只表示可以取出,但是不能设置,一旦设置了内容,程序编译就会出现错误提示。
“? extends 类”:设置泛型上限,可以在声明和方法参数上使用;
? extends Number:意味着可以设置Number或者是Number的子类(Integer、Double、…)
例:设置泛型的上限
package Project.Study.Genericity;class Message<T extends Number>{ //设置泛型上限,只能是Number或Number子类private T msg;public void setMsg(T msg){this.msg=msg;}public T getMsg() {return msg;}
}
public class Test1 {public static void main(String args[]){Message<Integer>message1=new Message<>(); //Integer是Number子类message1.setMsg(30);fun1(message1); //引用传递}public static void fun1(Message<? extends Number> temp){ //定义泛型上限System.out.println(temp.getMsg());}
}
//结果
//30
“? super 类”:设置泛型下限,方法参数上使用;
? super String:意味着只能设置String或它的父类Object。
例:设置泛型的下限
package Project.Study.Genericity;class Message<T>{ //定义泛型private T msg;public void setMsg(T msg){this.msg=msg;}public T getMsg() {return msg;}
}
public class Test1 {public static void main(String args[]){Message<String>message1=new Message<>();message1.setMsg("Hello World"); //设置属性内容fun1(message1); //引用传递}public static void fun1(Message<? super String> temp){ //定义泛型下限System.out.println(temp.getMsg());}
}
//结果
//Hello World
泛型接口
任何情况下如果要使用接口,就必须定义相应的子类,而对于使用了泛型的接口子类而言,有以下两种实现方式。
实现方式一:在子类继续设置泛型标记
例:
package Project.Study.Genericity;interface IMessage<T>{ //定义泛型接口public void print(T t);
}
class MessageImpl<S>implements IMessage<S>{ //在子类继续设置泛型,此泛型也作为接口中的泛型类型public void print(S t){System.out.println(t);}
}
public class Test2 {public static void main(String[] args){IMessage<String>msg=new MessageImpl<String>();msg.print("HelloWorld");}
}
//结果
//HelloWorld
实现方式二:在子类不设置泛型,而为父类接口明确地定义一个泛型类型。
package Project.Study.Genericity;interface IMessage1<T>{public void print(T t);
}
class MessageImpl1 implements IMessage1<String>{public void print(String t){System.out.println(t);}
}
public class Test3 {public static void main(String [] args){IMessage1<String>msg=new MessageImpl1();msg.print("HelloWorld");}
}
//结果
//HelloWorld
泛型方法
package Project.Study.Genericity;public class Test4 {public static void main(String [] args){String str=fun("HelloWorld");System.out.println(str.length());}/*** 此方法为泛型方法,T的类型由传入的参数类型决定* 必须在方法返回值前明确定义泛型标记* @param t 参数类型,同时也决定了返回值类型* @param <T>* @return 直接返回设置进来的内容*/public static <T>T fun(T t){return t;}
}
//结果
//10
相关文章:

Lab模式的妙用--人像处理
其实就是: 1.复制明度图层到RGB模式,降低透明度。 2.仿制图章磨皮 3.液化 4.可选颜色润饰皮肤。 转载于:https://www.cnblogs.com/wensu/p/4997579.html

springboot整合swagger2之最佳实践
来源:https://blog.lqdev.cn/2018/07/21/springboot/chapter-ten/ Swagger是一款RESTful接口的文档在线自动生成、功能测试功能框架。 一个规范和完整的框架,用于生成、描述、调用和可视化RESTful风格的Web服务,加上swagger-ui,可以有很好的…

转:动态链接库的全局变量问题
动态链接库的全局变量问题 请问动态链接库被外部多次调用时,每次调用中动态库自身的全局变量都会重新初始化吗?如果会那怎么来使我每次调用动态库时都能从上次的状态开始执行呢? 你这个问题得分被调用的是同一个进程还是不同的进程。如果是不…

排名前 16 的 Java 工具类
转载来自微信公众号:Java 技术栈。如有侵权,请联系作者删除!! 在 Java 中,工具类定义了一组公共方法,这篇文章将介绍 Java 中使用最频繁及最通用的 Java 工具类。以下工具类、方法按使用流行度排名…

c4d教程-太空火车站场景创作视频教程Skillshare – Create A Space Train Scene With Cinema 4D Redshift Render
c4d教程-太空火车站场景创作视频教程Skillshare – Create A Space Train Scene With Cinema 4D & Redshift Render 教程大小 1.66G 共15小节 1280X720 mp4 视频 语言:英语中文字幕 百度一下 云桥网络 平台huo取 教程! Skillshare – Create A Spa…

Java学习总结:23
前言:断更挺久了,今天把之前的补上 Annotation 3种最为常用的Annotation定义,Override、Deprecated和SuppressWarnings 1.准确的覆写:Override 当进行方法覆写时,为了保证子类所覆写的方法的确是父类中定义过的方法…

Windows Live Writer发布测试
通过Windows Live Writer发布文章测试!!!! 转载于:https://www.cnblogs.com/passerlee/p/5000567.html

2022-2028年中国锂电池用聚烯烃隔膜行业市场发展调研及投资方向分析报告
【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新(交付时间约3个工作日) 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国锂电池用聚烯烃隔膜行业市场行业相关概述、中国锂电池用聚烯烃隔膜行业市场行业运行环境、…

【莫队算法】bzoj3781 小B的询问
莫队经典。 开个数组维护a[i]出现的次数。 1 #include<cstdio>2 #include<cmath>3 #include<algorithm>4 using namespace std;5 int Num,CH[12],f,c;6 inline void R(int &x){7 c0;f1;8 for(;c<0||c>9;cgetchar())if(c-)f-1;9 for(x0…

计算机为什么需要十六进制?
我们知道内存是按照字节粒度来寻址的,因此采用的数字系统必须很好的表达一个字节,也就是8比特,从这个角度上看256进制(2^8)是最好的,因为一个256进制就是表达一个字节,但还是基于可读性的原因,256进制对于人类来说记忆负担过重,而16进制则刚刚好,一个16进制数字表示一个字节的一半(4个比特),两个16进制数字正好表示一个字节。每个十六进制中的数字代表4个比特,你可以非常直观的从十六进制中知道对应的二进制是啥,比如给定一个十六进制数,假设其最后一位是9,那为什么十六进制是二进制的好朋友呢?

JAVA 自定义函数式编程
2.2)定义接口 void testInterface(String str);2.定义一个普通接口(TestInterface.java) 2.1)类上注明为函数式接口有且只能有一个方法;

7.1.1 [Enterprise Library]缓存应用程序块场景和目标
缓存应用程序块为解决开发人员在缓存数据时所面对的绝大多数任务而设计。这些任务根据场景进行了组织,每个场景都给出了一个真实世界情况的示例,如添加条目到缓存,讨论了情况所需要的缓存功能,并展示了完成任务的代码。 根据场景组…

中式古建筑su模型大全
中式古建筑su模型大全 sketchup草图大师古建塔亭子寺庙名楼民居古建筑中式su模型素材 sketchup模型 古代建筑 古代房屋 古镇 古代街景 古代商业街 古代园林 阁楼 寺庙 含各类古建筑模型合集su模型 文件解压后大小:13G 含预览图 百度一下 云桥网络 平台huo取 素材…

Java学习总结:24
Lambda表达式 Lambda表达式指的是应用在单一抽象方法(SAM)接口环境下的一种简化定义形式,可以用于解决匿名内部类的定义复杂问题。 Lambda表达式的语法: (参数)->方法体相当于子类覆写抽象方法的方法体 例:Lambda表达式入门操作 packa…

【转】Flask安装
Flask 依赖两个外部库:Werkzeug 和 Jinja2 。 Werkzeug 是一个 WSGI(在 Web 应用和多种服务器之间的标准 Python 接口) 工具集。Jinja2 负责渲染模板。 那么如何在你的电脑上安装这一切?虽说条条大道通罗马,但是最强大的方式是 vi…

OpenFeign服务接口调用
OpenFeign是什么? Feign是一个声明式的web服务客户端,让编写web服务客户端变得非常容易,只需创建一个接口并在接口上添加注解即可。 OpenFeign能干什么? Feign和OpenFeign两者区别 OpenFeign使用步骤

完美解决网站PNG图标在IE6下的透明显示
现在IE6虽然有些落后,但不少xp用户还是首选IE6浏览器,一款经典长久也标准快速的浏览器必然会有忠实的用户,png图标IE6下默认是不支持的,可以通过js代码实现,下面由一叶扁舟为大家整理,代码可直接下载一、下…

WPF Layout System
http://blog.tangcs.com/2009/05/23/wpf-layout-system/转载于:https://www.cnblogs.com/WarrenTang/archive/2009/05/23/1487622.html

ZBrush全面入门学习教程 Schoolism – Introduction to ZBrush
ZBrush全面入门学习教程 Schoolism – Introduction to ZBrush ZBrush全面入门学习教程 Schoolism – Introduction to ZBrush 时长:8小时|视频:1920X1080 。教程大小 2.6G 语言:英语中文字幕 百度一下 云桥网络 平台huo取 教程! 这个课程非常适合那些…

Java学习总结:25
内建函数式接口 对于可能出现的函数式接口的方法最多只有4类:有参数有返回值、有参数无返回值、无参数有返回值、判断真假。 为了简化开发者的定义以及实现操作的统一,Java提供了一个新的开发包:java.util.function,并且在这个包…

Uva 3767 Dynamic len(set(a[L:R])) 树套树
Dynamic len(set(a[L:R])) Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 https://uva.onlinejudge.org/index.php?optioncom_onlinejudge&Itemid8&pageshow_problem&problem3767 Description 给你n个数,m次操作 Q x y 询问[x1,y]有多少个不同的数…

2022-2028年中国锂电池设备行业深度调研及投资前景预测报告
【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新(交付时间约3个工作日) 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国锂电池设备行业市场行业相关概述、中国锂电池设备行业市场行业运行环境、分析了中国锂电池…

Cocos Studio的动画系统介绍
Cocos Studio介绍Cocos Studio是一套基于Cocos2D-x的免费游戏开发工具集,它能帮助开发者快速创建游戏资源,将大部分繁琐的游戏开发工作使用编辑器来快速制作,进一步帮助游戏开发者减短开发周期、提高开发效率。Cocos Studio本身不光只是针对[…

机器学习实战源码数据集
链接:https://pan.baidu.com/s/1Ss7x60VXdyQFYW9aiKS0Lg 提取码:9xj6 github下载地址: 转载于:https://www.cnblogs.com/YukiNote/p/11286106.html

blender硬表面建模渲染终极教程
blender硬表面建模渲染终极教程 Gumroad - The ULTIMATE Guide to Hard Ops and Boxcutter Gumroad-硬操作和切箱机的终极指南 教程大小 6G 1920X1080分辨率 语言:英语中文字幕 含案例源文件 云桥网络 平台获取教程 本教程共包含两大部分 第一部分 硬操作和Boxcutter菜单…

Java学习总结:26
线程与进程 进程是程序的一次动态执行过程,它经历了从代码加载、执行到执行完毕的一个完整过程,这个过程也是进程本身从产生、发展到最终消亡的过程。 线程是比进程更小的执行单位,线程是在进程的基础上进行的进一步划分,一个进程…

UINavigationController技巧一——修改返回按钮的标题
UINavigationController 一般push到另一界面后,返回按钮标题便是上一页面的title,但是对于push的第一页或者是上一页面没有title的,返回按钮标题便是默认back,如图所示 在本页面修改title没有用,试了很多办法终于找到 …

Idea groovy表生成实体类带注释
Idea groovy表生成实体类带注释 1.点开datasourse,打开idea带的数据库工具,具体添加数据库连接,这里不描述。 这时点击会生成一个poji 这时生成的pojo中是不带中文注释的,需要自己配置,往下: 3.根据图中的步…

fflush函数的深入理解
本人昵称sky,欢迎与各位多多交流学习 这样的c程序想必大家都不陌生,fflush()这个函数有清除输入输出缓存的功能,那很多人就会问了,什么是清除输入输出缓存呢? 其实就是我们在printf输出的时候,是先输出到一…

VS快捷键专题
如要初始化VS开发环境,使用如下命令:开始->运行->键入“devenv.exe /resetuserdata”。 ShiftAltEnter: 切换全屏编辑CtrlB,T / CtrlK,K: 切换书签开关CtrlB,N / CtrlK,N: 移动到下一书签CtrlB,P: 移动到上一书签CtrlB,C: 清除全部标签CtrlI: 渐进式搜索CtrlShiftI: 反向…