java基础34 泛型的使用
本文知识点(目录):
1、泛型的好处
2、泛型在集合中的常见应用(这里只用String类型举例)
3、在泛型中是不能使用基本数据类型,如果需要使用基本数据类型,那么就使用基本数据类型对应的封装类型
4、在方法上自定义泛型
5、在类上自定义泛型
6、在接口类上自定义泛型
7、泛型的上下限
泛型是jdk1.5使用的新特性
1、泛型的好处
1.将运行是异常提前至编译时。
2.消除强制类型转换,所有的强制转换都是自动和隐式的,提高代码的重用率。
3.提高了Java程序的类型安全性。
2、泛型在集合中的常见应用(这里只用String类型举例)
ArrayList<String> list=new ArrayList<String>(); 推荐使用
下面两种写法是为了兼顾新老系统的兼容性问题
ArrayList<String> lists=new ArrayList();
ArrayList lists=new ArrayList<String>();
注意:泛型没有多态的概念,左右两边的数据类型要一致,或者只写一边的泛型。
3、在泛型中是不能使用基本数据类型,如果需要使用基本数据类型,那么就使用基本数据类型对应的封装类型
基本数据类型 封装类型
byte--------------->Byte
short-------------->Short
int----------------->Integer
long--------------->Long
double----------->Double
float--------------->Float
boolean--------->Boolean
char-------------->Character
4、在方法上自定义泛型
自定义泛型就是一个数据类型占位符或者一个数据类型变量
格式:
修饰符 <声明自定的泛型> 返回值类型 函数名(自定义泛型的类型 参数){ }
4.2、泛型方法需要注意的事项
1.泛型方法中自定义泛型具体数据类型是在调用该函数的时候传入实时参数确定的。
2.自定义泛型所用的标识符只要符号标识符的命名规范即可;但是我们习惯用一个大小的字母表示。
实例
public class Demo2 {
public static void main(String[] args) {
int i = getData();
String s = getData("hello");
System.out.println(i);//返回结果:23
System.out.println(s);//返回结果:hello
}
public static <abc>abc getData(abc o){//在方法上,自定义泛型
return o;
}
}
5、在类上自定义泛型
格式:
class 类名<声明自定义泛型>{
}
5.2、泛型类需要注意的事项
1.泛型类上自定义泛型是使用该类创建对象的时候自定的具体数据类型的.
2.如果一个类已经自定义了泛型,使用该类创建对象时,如果没有在指定泛型的具体类型,那么默认为Object类型
3.静态的函数不能使用类上自定义泛型,如果静态函数需要使用,必须要在函数上自定泛型
实例1
package com.dhb.collection; /**
* @author DSHORE / 2018-5-25
*
*/
//元素的反转
class MyArrays{
public <T> void reverse(T[] arr) {//在方法上,自定义泛型
for (int starIndex = ,endIndex = arr.length-; starIndex < endIndex; starIndex++,endIndex--) {
T temp = arr[starIndex];
arr[starIndex] = arr[endIndex];
arr[endIndex] = temp;
}
for (int i = ; i < arr.length; i++) {
System.out.print(arr[i]);//返回结果:87654321
}
}
}
public class Demo18 {
public static void main(String[] args) {
MyArrays ma = new MyArrays();
Integer[] integer = {,,,,,,,};
ma.reverse(integer);
}
}
实例2
package com.dhb.collection; /**
* @author DSHORE / 2018-5-25
*
*/
//元素的反转
class MyArrays<T>{//在类上,自定义泛型
public void reverse(T[] arr) {
for (int starIndex = ,endIndex = arr.length-; starIndex < endIndex; starIndex++,endIndex--) {
T temp = arr[starIndex];
arr[starIndex] = arr[endIndex];
arr[endIndex] = temp;
}
/*for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]);//返回结果:87654321
}*/
}
public String toString(T[] arr) {//自定义 输出格式
StringBuilder sb =new StringBuilder();
for (int i = ; i < arr.length; i++) {//第一个元素
if(i == ){
sb.append("["+arr[i]+",");
}else if(i == arr.length-){//最后一个元素
sb.append(arr[i]+"]");
}else{//中间的元素
sb.append(arr[i]+",");
}
}
return sb.toString();
}
}
public class Demo18 {
public static void main(String[] args) {
MyArrays<Integer> ma = new MyArrays<Integer>();
Integer[] in = {,,,,,,,};
ma.reverse(in);
System.out.println(ma.toString(in));//返回结果:[8,7,6,5,4,3,2,1]
}
}
6、在接口类上自定义泛型
格式:
interface 接口名<声明自定义泛型>{
}
6.1、泛型接口需要注意的事项
1.在接口上自定义的泛型,具体数据类型是在实现接口的时候指定的。
2.在接口上自定义的泛型,具体数据类型在实现接口时没有指定,那么默认问哦Object类型。
3.如果需要在创建接口实现类对象的时候才指定自定义泛型,那么需要一下格式:class<T> 类名 implements 接口<T>{ }
6.2、如果延长接口的自定义泛型的数据类型,那么格式如下
格式:
public class Demo4<t> implements Dao<t>{//t:声明自定义泛型
}
实例
interface Dao<T>{
public void add(T t);
public void update(T t);
}
public class Demo4<T> implements Dao<T>{
public static void main(String[] args) {
Demo4<String> d=new Demo4<String>();
}
@Override
public void add(T t) {
// TODO Auto-generated method stub
}
@Override
public void update(T t) {
// TODO Auto-generated method stub
}
}
7、泛型的上下限
? super Integer 允许是Integer类型或者是Integer父类的类型 泛型的下限
? extends Number 允许是Number类型或者Number子类的数据类型 泛型的上限
package com.dhb.collection; import java.util.ArrayList;
import java.util.Collection; /**
* @author DSHORE / 2018-5-25
*
*/
/* 泛型的上下限
*
* 需求1:定义一个函数可以接收任意类型的集合对象,要求接收的集合对象只能存储Integer或者是Integer的父类类型的数据
* 需求2:定义一个函数可以接收任意类型的集合对象,要求接收的集合对象只能存储Number或者是Number的子类类型的数据
*
* 泛型中的通配符:?
* <? super Integer>:只能存储Interger或者是Interger的父类元素. 泛型的下限
* <? extends Number>:只能存储Number或者Number以下的子类元素. 泛型的上限
* */
public class Demo19 {
public static void main(String[] args) {
//泛型的上线
ArrayList<Double> list = new ArrayList<Double>();//Number最大,所以<>里的泛型是子类的什么类型都行(上线,看关键字extends)
getDate(list);
//泛型的下线
ArrayList<Integer> list1 = new ArrayList<Integer>();//要看super后面的类型确定当前泛型的类型(下线,看关键字super)
print(list1);
}
//泛型的上线
public static void getDate(Collection<? extends Number> c){//Number或者以下的都可以 }
//泛型的下线
public static void print(Collection<? super Integer> c){//Interger或者以上的都可以 }
}
原创作者:DSHORE 作者主页:http://www.cnblogs.com/dshore123/ 原文出自:https://www.cnblogs.com/dshore123/p/9090210.html 欢迎转载,转载务必说明出处。(如果本文对您有帮助,可以点击一下右下角的 推荐,或评论,谢谢!) |
检测语言 世界语 中文简体 中文繁体 丹麦语 乌克兰语 乌兹别克语 乌尔都语 亚美尼亚语 伊博语 俄语 保加利亚语 信德语 修纳语 僧伽罗语 克罗地亚语 冰岛语 加利西亚语 加泰罗尼亚语 匈牙利语 南非祖鲁语 卡纳达语 卢森堡语 印地语 印尼巽他语 印尼爪哇语 印尼语 古吉拉特语 吉尔吉斯语 哈萨克语 土耳其语 塔吉克语 塞尔维亚语 塞索托语 夏威夷语 威尔士语 孟加拉语 宿务语 尼泊尔语 巴斯克语 布尔语(南非荷兰语) 希伯来语 希腊语 库尔德语 弗里西语 德语 意大利语 意第绪语 拉丁语 拉脱维亚语 挪威语 捷克语 斯洛伐克语 斯洛文尼亚语 斯瓦希里语 旁遮普语 日语 普什图语 格鲁吉亚语 毛利语 法语 波兰语 波斯尼亚语 波斯语 泰卢固语 泰米尔语 泰语 海地克里奥尔语 爱尔兰语 爱沙尼亚语 瑞典语 白俄罗斯语 科萨 科西嘉语 立陶宛语 索马里语 约鲁巴语 缅甸语 罗马尼亚语 老挝语 芬兰语 苏格兰盖尔语 苗语 英语 荷兰语 菲律宾语 萨摩亚语 葡萄牙语 蒙古语 西班牙语 豪萨语 越南语 阿塞拜疆语 阿姆哈拉语 阿尔巴尼亚语 阿拉伯语 韩语 马其顿语 马尔加什语 马拉地语 马拉雅拉姆语 马来语 马耳他语 高棉语 齐切瓦语 |
世界语 中文简体 中文繁体 丹麦语 乌克兰语 乌兹别克语 乌尔都语 亚美尼亚语 伊博语 俄语 保加利亚语 信德语 修纳语 僧伽罗语 克罗地亚语 冰岛语 加利西亚语 加泰罗尼亚语 匈牙利语 南非祖鲁语 卡纳达语 卢森堡语 印地语 印尼巽他语 印尼爪哇语 印尼语 古吉拉特语 吉尔吉斯语 哈萨克语 土耳其语 塔吉克语 塞尔维亚语 塞索托语 夏威夷语 威尔士语 孟加拉语 宿务语 尼泊尔语 巴斯克语 布尔语(南非荷兰语) 希伯来语 希腊语 库尔德语 弗里西语 德语 意大利语 意第绪语 拉丁语 拉脱维亚语 挪威语 捷克语 斯洛伐克语 斯洛文尼亚语 斯瓦希里语 旁遮普语 日语 普什图语 格鲁吉亚语 毛利语 法语 波兰语 波斯尼亚语 波斯语 泰卢固语 泰米尔语 泰语 海地克里奥尔语 爱尔兰语 爱沙尼亚语 瑞典语 白俄罗斯语 科萨 科西嘉语 立陶宛语 索马里语 约鲁巴语 缅甸语 罗马尼亚语 老挝语 芬兰语 苏格兰盖尔语 苗语 英语 荷兰语 菲律宾语 萨摩亚语 葡萄牙语 蒙古语 西班牙语 豪萨语 越南语 阿塞拜疆语 阿姆哈拉语 阿尔巴尼亚语 阿拉伯语 韩语 马其顿语 马尔加什语 马拉地语 马拉雅拉姆语 马来语 马耳他语 高棉语 齐切瓦语 |
java基础34 泛型的使用的更多相关文章
- 黑马程序员:Java基础总结----泛型(高级)
黑马程序员:Java基础总结 泛型(高级) ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 泛型(高级) 泛型是提供给javac编译器使用的,可以限定集合中的输入类型 ...
- 黑马程序员——JAVA基础之泛型和通配符
------- android培训.java培训.期待与您交流! ---------- 泛型: JDK1.5版本以后出现新特性.用于解决安全问题,是一个类型安全机制. 泛型好处: ...
- Java基础知识--泛型
什么是泛型?为什么使用泛型? 泛型,就是参数化类型.提到参数,最熟悉的就是定义方法时候的形参,然后调用此方法时传递实参.顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也 ...
- Java基础:泛型
Java的泛型是什么呢, 就是类型的參数化,这得类型包含方法參数和返回值.也就是原本该是确定类型的地方换成了变量,把类型的确定时间向后延迟了. 在之前,学过"重载"的概念,重载是什 ...
- day1 java基础回顾-泛型
2.泛型(Generic) 当集合中存储的对象类型不同时,那么会导致程序在运行的时候的转型异常 1 import java.util.ArrayList; 2 import java.util.Ite ...
- 【Java基础】泛型
Num1:请不要在新代码中使用原生类型 泛型类和接口统称为泛型.每种泛型定义一组参数化的类型,构成格式是:类或接口名称,接着用<>把对应于泛型形式类型的参数的实际参数列表括起来.比如:Li ...
- 黑马程序员——【Java基础】——泛型、Utilities工具类、其他对象API
---------- android培训.java培训.期待与您交流! ---------- 一.泛型 (一)泛型概述 1.泛型:JDK1.5版本以后出现的新特性,用于解决安全问题,是一个类型安全机制 ...
- Java基础之泛型——使用二叉树进行排序(TryBinaryTree)
控制台程序. 1.实现针对容器类的基于集合的循环 为了让容器类类型的对象能够在基于集合的for循环中可用,类必须并且只需要满足一个要求——必须实现泛型接口java.lang.Iterable<& ...
- java基础之 泛型
泛型(Generic type 或者generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数化类型时指定的类型的一个占位符,就像方法 ...
随机推荐
- Linux内核设计第七周学习总结 Linux内核如何装载和启动一个可执行程序
陈巧然原创作品 转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-100002900 实验目的 使用gdb跟踪s ...
- 安装Xtrabackup,设置定时备份msyql数据库
Xtrabackup是由percona提供的mysql数据库备份工具,据官方介绍,这也是世界上惟一一款开源的能够对innodb和xtradb数据库进行热备的工具. XtraDB 存储引擎是由Perco ...
- Android Layout: TableLayout
TableLayout<TableLayout xmlns:android="http://schemas.android.com/apk/res/android" andr ...
- 【堆的启发式合并】【P5290】[十二省联考2019]春节十二响
Description 给定一棵 \(n\) 个节点的树,点有点权,将树的节点划分成多个集合,满足集合的并集是树的点集,最小化每个集合最大点权之和. Limitation \(1~\leq~n~\le ...
- 预读(读取文件前几行)文件(txt,dat,csv等)程序
需求: txt.dat.csv文件很大,需要花很长的时间打开, 但实际上我们只需要查看文件的前几行,查看数据的内容和格式 exe & code : https://github.com/co ...
- git "refusing to merge unrelated histories" 解决方法
出现这个错误是因为本地的 git 历史和远程仓库的 git 历史不一样,如果我们想要合并两个不同的 git 历史(我们必须要清楚我们在做什么),就可以使用这个选项来进行强制合并不同的 git 历史,如 ...
- chrome神插件之:SwitchyOmega的安装设置
转至:http://yiweifen.com/v-1-118586.html 前言 往常找某草的网站基本上是这样的:先FQ,然后谷歌找1024,出现很多某草的更新地址,大多都是广告,大约需要花十几分钟 ...
- Kubernetes之利用prometheus监控K8S集群
prometheus它是一个主动拉取的数据库,在K8S中应该展示图形的grafana数据实例化要保存下来,使用分布式文件系统加动态PV,但是在本测试环境中使用本地磁盘,安装采集数据的agent使用Da ...
- CSS3 渐变,rgba与hsla
radial-gradient:径向渐变 ellipse:椭圆形渐变默认,circle:圆形渐变 定义渐变大小,指定终点位置: farthest-corner:默认,指定径向渐变的半径长度为:从圆心到 ...
- bzoj千题计划171:bzoj2456: mode
http://www.lydsy.com/JudgeOnline/problem.php?id=2456 任意删除序列中两个不同的数,众数仍然是众数 不停的删,剩下的最后的数一定是众数 具体实现: 记 ...