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 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数化类型时指定的类型的一个占位符,就像方法 ...
随机推荐
- Android Studio多Module使用 aar 依赖包 丢包解决
FAQ: AAR打包引用丢包问题, jar, aar, dependency 嵌套层级依赖的丢失 问: aar包中,如何包含第三方依赖库? 如果直接作为module 依赖是没有问题的,但是如果打包成a ...
- Webpack + React 开发 03 props
React中组件的用法与原生的 HTML 标签完全一致,可以任意加入属性,比如 <HelloWorld name="John"> ,就是 HelloWorld 组件加入 ...
- (转)Tomcat version 7.0 only supports J2EE 1.2, 1.3, 1.4, and Java EE 5 and 6 Web mod
背景:在sts中导入web项目,却不能通过sts中的tomcat来加载该服务,并报出如下错误. “Tomcat version 7.0 only supports J2EE 1.2, 1.3, 1.4 ...
- docker:轻量级图形页面管理之Portainer
docker:轻量级图形页面管理之Portainer 原创甘兵2018-03-05 14:26:56评论(8)2586人阅读 1.介绍 docker 图形化管理提供了很多工具,有Portainer ...
- 服务器(Linux) 安装python3
1.python3和python2可以共存,不用删自带的python2 服务器Linux下默认系统自带python2.6的版本,这个版本被系统很多程序所依赖,所以不建议删除.如果使用最新的Python ...
- Python【面向对象编程】
#1.python中,类名首字母都大写#2.在python3中,经典类和新式类没有任何区别#3.在python2中,经典类和新式类的区别主要体现在多继承上,经典类是深度优先,新式类是广度优先#4.在p ...
- java内存溢出xms xmx
java内存堆栈不够用时我们会寻求java参数-Xms和-Xmx的帮助,网上也有许多前辈给出了例子,但很多人喜欢把-Xms和-Xmx的值设置成一样的,甚至我还见过有吧-Xms设的比-Xmx还要大(-X ...
- C语言第九节进制
进制 什么是进制 是一种计数的方式,数值的表示形式 数一下方块的个数 汉字:十一 十进制:11 二进制:1011 八进制:13 多种进制:十进制.二进制.八进制.十六进制.也就是说,同一个整数,我们至 ...
- Linux命令练习.ziw
2017年1月10日, 星期二 Linux命令练习 1.统计/usr/bin/目录下的文件个数: # ls /usr/bin | wc -l 判断 /home/goldin目录是否有文件 2.取出当前 ...
- MongoDB - Introduction to MongoDB, Databases and Collections
MongoDB stores BSON documents, i.e. data records, in collections; the collections in databases. Data ...