泛型是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泛型总结相关推荐

  1. java 泛型集合应用_Java泛型集合的应用和方法

    展开全部 泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以62616964757a686964616fe78988e69d8331333 ...

  2. java 怎么为泛型参数赋值_Java泛型讲解

    1. 概述在引入泛型之前,Java类型分为原始类型.复杂类型,其中复杂类型分为数组和类.引入范型后,一个复杂类型 就可以在细分成更多的类型. 例如原先的类型List,现在在细分成List, List等 ...

  3. java泛型详解_Java泛型详解(透彻)

    定义 Java中的泛型在JavaSE5中引入. 所谓泛型,即参数化类型.就是说,类型是以参数的方式传入泛型类. 例如: ArrayList aaryList = new ArrayList(); 那么 ...

  4. 描述java泛型引入原则_Java/泛型的类型擦除/README.md · oslo/LearningNotes - Gitee.com

    前言 Java 泛型(Generic)的引入加强了参数类型的安全性,减少了类型的转换,但有一点需要注意:Java 的泛型在编译器有效,在运行期被删除,也就是说所有泛型参数类型在编译后都会被清除掉,看下 ...

  5. java 泛型 默认值_java泛型 Java泛型的入门知识

    在学习java的过程当中,我们就肯定会接触到java泛型,那么你知道java泛型是什么吗,有关java的使用方法又有哪些呢?今天小编就从java泛型的使用方法来了解一下java泛型这一知识. java ...

  6. java泛型常用特点_Java泛型详解

    对java的泛型特性的了解仅限于表面的浅浅一层,直到在学习设计模式时发现有不了解的用法,才想起详细的记录一下. 本文参考java 泛型详解.Java中的泛型方法. java泛型详解 1. 概述 泛型在 ...

  7. java泛型的作用_Java 泛型的作用及其基本概念

    一.泛型的基本概念 java与c#一样,都存在泛型的概念,及类型的参数化.java中的泛型是在jdk5.0后出现的,但是java中的泛型与C#中的泛型是有本质区别的,首先从集合类型上来说,java 中 ...

  8. java泛型与接口_Java泛型用于方法,类和接口

    什么是泛型? 型就是数据类型参数化.就是说原本定死的数据类型像方法中的形参一样,数据是不确定的,使用的时候由人传进去,泛型就是这样,数据类型不确定了.使用的时候再确定就可以了. 泛型的特点 是JDK1 ...

  9. java 泛型集合示例_Java 泛型(示例代码)

    1.泛型的由来 我们先看下面这段代码: 报错信息如下: 也就是 集合中第二个数据是 Integer,但是我们取出来的时候将其转换为 String 了,所以报错. 那么这个如何解决呢? ①.我们在遍历的 ...

最新文章

  1. Android p2p service,android – WifiP2pDnsSdServiceInfo.newInstance中的可用服务类型
  2. C++对C的改进(1)
  3. [翻译]编写高性能 .NET 代码 第一章:性能测试与工具 -- 选择什么来衡量
  4. java中程序执行顺序
  5. mongobd运行电脑不允许_U盘中的操作系统:Chrome OS,极致简洁超流畅,拯救你的旧电脑...
  6. 推荐2021年最受欢迎的15款Vue后台管理模板
  7. linux 安装核显驱动程序,在Ubuntu系统上安装英特尔核显驱动安装器的方法
  8. 【网络相关】curl可以访问浏览器打不开,无法访问此网站,ERR_UNSAFE_PORT。10080端口
  9. 音响的灵魂! 世界顶级扬声器品牌介绍
  10. 数据库面试题SQL篇
  11. element步骤条实战
  12. 正交采样 matlab,MATLAB数值积分(正交)
  13. 《算法笔记》第4章常用技巧
  14. c++对数函数 log() 操作
  15. 湖南大学计算机考研群2021,湖南大学2021年硕士研究生拟录取名单公示
  16. Bluetooth Profile Specification之1.1 A2DP 之Audio Codec(音频编解码器)-SBC
  17. 部分iphone机型无法实现css的animation动画效果(无效, 失效)
  18. 宁波大学考博c语言真题,宁波大学考博英语历年真题详解
  19. 修改浏览器的标题和图标
  20. vs2017试用期满了无法登陆怎么办

热门文章

  1. java文件复制(可过滤)
  2. 在shop++二次开发中金额数据类型BigDecimal转换,注意细节。
  3. SqlServer表中两条全然同样的记录,怎样删除当中1条
  4. mysql5.0.x统计每秒增删改查替换数及系统每秒磁盘IO
  5. SSO (单点登录)实现方式
  6. 创建了一个.NET 技术的 Wiki 和论坛
  7. Spring boot MultipartResolver
  8. oracle数据库主主复制
  9. MySql中的内外联结查询
  10. 仿新浪邮件输入自动提示jQuery插件