泛型 java 总结_JAVA泛型总结
泛型是JDK1.5的新东西,总结了一下,以后备忘,
泛型也叫generics,泛型分泛型方法和泛型类,两种定义方式,泛型还有上界下界的说法,
先看看什么叫泛型方法和泛型类,一下是网上的一个解释,个人觉得已经讲的很清楚了:
2、我们将Dao层的类写成范型的形式,有两种写法:
其一、
package com.test;
public class EntityDao1 {
public void add(T t){
//查询实体的代码
}
public T get(ID id){
//.保存实体的代码
return null;
}
} 范型一般用于方法的参数或者方法的返回值,上面的写法,我们要使范型有效,就须在方法的返回类型前加入强制范型转换。其中,add(T t)的参数用了范型,它的返回值是void型,就在void 前用强制类型转换,即加上,强制转换成范型的形式,这样就不会报错了。而T get(ID id),由于它的参数和返回类型都用了范型,故要在返回类型T前强制转换,即。
其二,范型也可写成以下形式:
package com.test;
public class EntityDao2 {
public void add(T t){
//..保存实体的代码
}
public T get(ID id){
//.查询实体的代码
return null;
}
}这种形式,是把范型声明放在类中了,就不需每个方法都写强制类型转换。
看实际需要,哪种方法方便就用哪种吧!范型给Java编程带来了许多方便,好好利用,会达到事半功倍的效果。
再看看什么叫上界和下界:
上界:
上界用extends关键字声明,表示参数化的类型可能是所指定的类型,或者是此类型的子类。如下面的代码:
Java代码
publicvoidupperBound(List<?extendsDate> list, Date date)
{
Date now = list.get(0);
System.out.println("now==>"+ now);
//list.add(date); //这句话无法编译
list.add(null);//这句可以编译,因为null没有类型信息
}
为什么会无法编译呢,实际调用时传入的list可能是java.util.Date的某个子类的参数化类型,如:
Java代码
publicvoidtestUpperBound()
{
List list = newArrayList();
Date date = newDate();
upperBound(list,date);
}
也就是说,现在upperBound方法中实际的list是List,向它添加一个Date类型,肯定是不行的。相反,读取数据时,不管实际的list是什么类型,但可以知道它至少会返回一个Date类型,所以用foreach,get等没有问题。
那么如何解决呢,可以使用泛型方法
Java代码
publicvoidupperBound2(List list, T date)
{
list.add(date);
}
这里方法声明中的T作为一种参数化信息,会存储在java字节码中,T的实际类型由调用时的参数决定的。比如:
Java代码
publicvoidtestUpperBound2()
{
List list = newArrayList();
Date date = newDate();
Timestamp time = newTimestamp(date.getTime());
upperBound2(list,time);
//upperBound2(list,date);//这句同样无法编译
}
上面代码中的list的类型参数决定了方法中T的类型,所以会看到注释掉的内容不能编译。而换成这样:
List list2 = new ArrayList();
upperBound2(list2,date);
编译就没有任何问题了。
下界
下界用super进行声明,表示参数化的类型可能是所指定的类型,或者是此类型的父类型,直至Object。如下面的代码:
Java代码
publicvoidlowerBound(List<?superTimestamp> list)
{
Timestamp now = newTimestamp(System.currentTimeMillis());
list.add(now);
//Timestamp time = list.get(0); //不能编译
}
这又为什么不能通过编译呢,看看调用代码:
Java代码
publicvoidtestLowerBound()
{
List list = newArrayList();
list.add(newDate());
lowerBound(list);
}
lowerBound方法中的List super Timestamp>表示这个list的参数类型可能是Timestamp或Timestamp的父类,如后面测试代码里,实际传入的是一个List类型。向List中add一个Timestamp肯定是没有问题的,但list.get()方法返回的对象类型可能是Date甚至是Object,你不能说list.get(0)返回的就是一个Timestamp,这里是向下类型转换了,编译器无法处理,所以这里不能编译。用java泛型实现的擦拭法解释,编译后会是如下的伪代码:
Java代码
publicvoidlowerBound(List list)
{
Timestamp now = newTimestamp(System.currentTimeMillis());
list.add(now);
Timestamp time = (Timestamp)list.get(0);//①
}
publicvoidtestLowerBound()
{
List list = newArrayList();
list.add(newDate());
lowerBound(list);
}
代码①进行了强制类型转换,但实际添加进去的是一个Date类型,肯定会报ClassCastException,编译器无法保证向下类型转换的安全,所以这一句自然就无法编译了。
泛型 java 总结_JAVA泛型总结相关推荐
- java 泛型集合应用_Java泛型集合的应用和方法
展开全部 泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以62616964757a686964616fe78988e69d8331333 ...
- java 怎么为泛型参数赋值_Java泛型讲解
1. 概述在引入泛型之前,Java类型分为原始类型.复杂类型,其中复杂类型分为数组和类.引入范型后,一个复杂类型 就可以在细分成更多的类型. 例如原先的类型List,现在在细分成List, List等 ...
- java泛型详解_Java泛型详解(透彻)
定义 Java中的泛型在JavaSE5中引入. 所谓泛型,即参数化类型.就是说,类型是以参数的方式传入泛型类. 例如: ArrayList aaryList = new ArrayList(); 那么 ...
- 描述java泛型引入原则_Java/泛型的类型擦除/README.md · oslo/LearningNotes - Gitee.com
前言 Java 泛型(Generic)的引入加强了参数类型的安全性,减少了类型的转换,但有一点需要注意:Java 的泛型在编译器有效,在运行期被删除,也就是说所有泛型参数类型在编译后都会被清除掉,看下 ...
- java 泛型 默认值_java泛型 Java泛型的入门知识
在学习java的过程当中,我们就肯定会接触到java泛型,那么你知道java泛型是什么吗,有关java的使用方法又有哪些呢?今天小编就从java泛型的使用方法来了解一下java泛型这一知识. java ...
- java泛型常用特点_Java泛型详解
对java的泛型特性的了解仅限于表面的浅浅一层,直到在学习设计模式时发现有不了解的用法,才想起详细的记录一下. 本文参考java 泛型详解.Java中的泛型方法. java泛型详解 1. 概述 泛型在 ...
- java泛型的作用_Java 泛型的作用及其基本概念
一.泛型的基本概念 java与c#一样,都存在泛型的概念,及类型的参数化.java中的泛型是在jdk5.0后出现的,但是java中的泛型与C#中的泛型是有本质区别的,首先从集合类型上来说,java 中 ...
- java泛型与接口_Java泛型用于方法,类和接口
什么是泛型? 型就是数据类型参数化.就是说原本定死的数据类型像方法中的形参一样,数据是不确定的,使用的时候由人传进去,泛型就是这样,数据类型不确定了.使用的时候再确定就可以了. 泛型的特点 是JDK1 ...
- java 泛型集合示例_Java 泛型(示例代码)
1.泛型的由来 我们先看下面这段代码: 报错信息如下: 也就是 集合中第二个数据是 Integer,但是我们取出来的时候将其转换为 String 了,所以报错. 那么这个如何解决呢? ①.我们在遍历的 ...
最新文章
- Android p2p service,android – WifiP2pDnsSdServiceInfo.newInstance中的可用服务类型
- C++对C的改进(1)
- [翻译]编写高性能 .NET 代码 第一章:性能测试与工具 -- 选择什么来衡量
- java中程序执行顺序
- mongobd运行电脑不允许_U盘中的操作系统:Chrome OS,极致简洁超流畅,拯救你的旧电脑...
- 推荐2021年最受欢迎的15款Vue后台管理模板
- linux 安装核显驱动程序,在Ubuntu系统上安装英特尔核显驱动安装器的方法
- 【网络相关】curl可以访问浏览器打不开,无法访问此网站,ERR_UNSAFE_PORT。10080端口
- 音响的灵魂! 世界顶级扬声器品牌介绍
- 数据库面试题SQL篇
- element步骤条实战
- 正交采样 matlab,MATLAB数值积分(正交)
- 《算法笔记》第4章常用技巧
- c++对数函数 log() 操作
- 湖南大学计算机考研群2021,湖南大学2021年硕士研究生拟录取名单公示
- Bluetooth Profile Specification之1.1 A2DP 之Audio Codec(音频编解码器)-SBC
- 部分iphone机型无法实现css的animation动画效果(无效, 失效)
- 宁波大学考博c语言真题,宁波大学考博英语历年真题详解
- 修改浏览器的标题和图标
- vs2017试用期满了无法登陆怎么办