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 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数化类型时指定的类型的一个占位符,就像方法 ...
随机推荐
- 【poj3294】 Life Forms
http://poj.org/problem?id=3294 (题目链接) 题意 给定 n 个字符串,求出现在不小于 k 个字符串中的最长子串. Solution 后缀数组论文题.. 将 n 个字符串 ...
- Mac上安装mariadb
1.查看mariadb包信息 # brew info mariadb mariadb: stable 10.2.6 (bottled) Drop-in replacement for MySQL ht ...
- 那些ie6已支持的方法属性,成为事实标准。或者方便大家的api
很多api,都是ie6实现,后来其他w3c或其他浏览器支持,或者用类似的方法模拟 onselectionchange 判断选区改变 ,chrome已支持 Element.contains 判断元 ...
- 20170520 DP阶段总结
DP的力量不是无穷的. 但是,因为它叫做“动态规划”,它在OI界如鱼得水.这个“动态”不是指“离线”与“在线”,也不是什么“可持久化”.它只是把问题抽象为一个个“阶段”,在每一个“阶段”中作出或繁或简 ...
- python之旅:并发编程之多进程理论部分
一 什么是进程 进程:正在进行的一个过程或者说一个任务.而负责执行任务则是cpu. 举例(单核+多道,实现多个进程的并发执行): egon在一个时间段内有很多任务要做:python备课的任务,写书的任 ...
- windows10下R配置Rstdio,怎么处理
首先要确保电脑上只有一个R程序,然后官网下载Rstdio安装包. 配置:选择Rstdio配置界面的第三项,然后关联到R的安装文件夹下的BIN文件夹即可. 但是,直接打开Rstdio的话,界面会一片空白 ...
- 使用 python 将 "\r\n" 转换为 "\n"
众所周知, Linux 下没有 "\r\n", 而 windows 下文本工具默认打开文件时使用 t 模式, 使得写入一行结尾的换行符为 "\r\n", 这样造 ...
- 线性回归,感知机,逻辑回归(GD,SGD)
线性回归 线性回归是一个回归问题,即用一条线去拟合训练数据 线性回归的模型: 通过训练数据学习一个特征的线性组合,以此作为预测函数. 训练目标:根据训练数据学习参数(w1,w2, ... , wn,b ...
- GO_05:GO语言基础map与函数
1. map 1. 类似其它语言中的哈希表活着字典,以 key-value 形式存储数据 2. key 必须是支持 == 或 != 比较运算的类型,不可以是函数.map 或 slice 3. map ...
- java基础-BigDecimal类常用方法介绍
java基础-BigDecimal类常用方法介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.BigDecimal类概述 我们知道浮点数的计算结果是未知的.原因是计算机二进制 ...