在学习泛型之前我们先回顾下Java的数据类型以及涉及到的一些概念。

Java数据类型

Java的两大数据类型分为基础类型和引用类型。基本类型的数值不是对象,不能调用对象的toString()、hashCode()、getClass()、equals()等方法。

自动装箱

把基本类型用它们对应的引用类型包装起来,使它们具有对象的特质,可以调用toString()、hashCode()、getClass()、equals()等方法。

例如:

//自动装箱Integer i=1;

而实际上编译器会调用static Integer valueOf(int i)这个方法,返回一个表示指定int值的Integer对象。Integer i=1; ->. Integer i=Integer.valueOf(1);

拆箱

跟自动装箱的方向相反,将引用类型转换为基本类型。

//拆箱int i = new Integer(1);

自动装箱和拆箱是由编译器来完成的,编译器会在编译期根据语法决定是否进行装箱和拆箱动作。

假如我们定义一个类来表示坐标,要求类中基础类型可以为整数 、小数、字符串,例如:

Object x=116,y=54;Object x=116.92,y=54.31;Object x="经度116.92",y="纬度54.31";

我们知道,基本数据类型可以自动装箱,被转换成对应的包装类。Object 是所有类的祖先类,任何一个类的实例都可以向上转型为 Object 类型,例如:

int -> Integer -> Objectdouble -> Double -> ObjectString -> Object

泛型的使用

如果要取出坐标值就需要向下转型,向下转型存在着风险,而且编译期间不容易发现,只有在运行期间才会抛出异常,所以要尽量避免使用向下转型。例如下面的实例:

public class Test {    public static void main(String[] args){        Point point = new Point();        //int -> Integer -> Object        point.setX(116);        point.setY(54);        //向下转型        int x = (Integer) point.getX();        int y = (Integer) point.getY();        System.out.println("Point :x="+x+" y="+y);        //double -> Double -> Object        point.setX(116.92);        point.setY("纬度54.32");        //向下转型        Double x1 = (Double) point.getX();        //会抛出ClassCastException异常        Double y1 = (Double) point.getY();        System.out.println("Point :x1="+x1+" y1="+y1);    }}class Point{    Object x = null;    Object y = null;    public Object getX() {        return x;    }    public void setX(Object x) {        this.x = x;    }    public Object getY() {        return y;    }    public void setY(Object y) {        this.y = y;    }}

那么Java中如何避免这样的情况发生呢?

Java中泛型出现就是解决出现这样的问题,所谓的“泛型”就是任意的数据类型。以下代码将利用泛型解决上面的问题。

public class Test {    public static void main(String[] args){        //实例化泛型        Point point = new Point();        point.setX(116);        point.setY(54);        int x = point.getX();        int y =  point.getY();        System.out.println("Point :x="+x+" y="+y);        Point point1 = new Point();        point1.setX(116.92);        point1.setY("纬度54.32");        Double x1 =  point1.getX();        String y1 = point1.getY();        System.out.println("Point :x1="+x1+" y1="+y1);    }}//定义泛型类class Point{    T1 x = null;    T2 y = null;    public T2 getY() {        return y;    }    public void setY(T2 y) {        this.y = y;    }    public T1 getX() {        return x;    }    public void setX(T1 x) {        this.x = x;    }}

实例中的T1和T2叫类型参数,类型参数是用来表示自定义标识符,用来传递数据的类型。Java中传值参数用小括号包围,泛型参数用尖括号包围,多个参数用逗号间隔,例如:

类型参数需要在类名后面给出。一旦给出了类型参数,就可以在类中使用了。类型参数必须是一个合法的标识符,习惯上使用单个大写字母,通常情况下,K 表示键,V 表示值,E 表示异常或错误,T 表示一般意义上的数据类型。

泛型类在实例化时必须指出具体的类型,也就是向类型参数传值,格式为:

className variable = new className();

也可以省略等号右边的数据类型,但是会产生警告,即:

className variable = new className();

泛型的优点:使用泛型类时指明了数据类型,赋给其他类型的值会抛出异常,既不需要向下转型,也没有潜在的风险。

除了定义泛型类,还可以定义泛型接口和泛型方法,使用泛型方法时不必指明参数类型,编译器会根据传递的参数自动查找出具体的类型。

限制泛型的可用类型

通过 extends 关键字可以限制泛型的类型

public  T getMax(T array[]){    T max = null;    for(T element : array){        max = element.doubleValue() > max.doubleValue() ? element : max;    }    return max;}

表示 T 只接受 Number 及其子类,传入其他类型的数据会报错。这里的限定使用关键字 extends,后面可以是类也可以是接口。但这里的 extends 已经不是继承的含义了,应该理解为 T 是继承自 Number 类的类型。

java null转换jason_Java进阶知识,轻松理解Java泛型相关推荐

  1. java null转换jason_Java笔记Java常量、变量

    "要成为绝世高手,并非一朝一夕,除非是天生武学奇才,但是这种人-万中无一" --包租婆这道理放在Java语言学习上也一并受用.在编程方面有着天赋异禀的人毕竟是少数,我们大多数人想要 ...

  2. java null转换jason_常见java问题及解决办法汇总(干货可收藏)

    Java Exception: 1.Error 2.Runtime Exception 运行时异常 3.Exception 4.throw 用户自定义异常 异常类分两大类型:Error类代表了编译和系 ...

  3. Java 并发编程解析 , 如何正确理解Java领域中的内存模型

    这些年,随着CPU.内存.I/O 设备都在不断迭代,不断朝着更快的方向努力.在这个快速发展的过程中,有一个核心矛盾一直存在,就是这三者的速度差异.CPU 和内存的速度差异可以形象地描述为:CPU 是天 ...

  4. 【Java书笔记】:《深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)》第2部分-自动内存管理,第3部分-虚拟机执行子系统,第5部分-高效并发

    作者:周志明 整理者GitHub:https://github.com/starjuly/UnderstandingTheJVM 第2部分-自动内存管理 第2章 Java内存区域与内存溢出异常 2.2 ...

  5. java如果不使用多态_深入理解java多态没有烤山药的存在,java就不香了吗?

    @ 我不想知道各位理解java多态没有烤山药的存在,java香不香的问题了,我不要你们认为,我只要我觉得 (感觉要被打....) 在博主认为多态绝对是面向对象的第三大特性中让很多小白同学以及初学者难以 ...

  6. java log4j logback jcl_进阶之路:Java 日志框架全画传(下)

    导读:随着互联网和大数据的蓬勃发展,分布式日志系统以及日志分析系统得到了广泛地应用.目前,几乎在所有应用程序中,都会用到各种各样的日志框架来记录程序的运行信息.鉴于此,工程师十分有必要熟悉主流的日志记 ...

  7. java中io是什么_深入理解Java中的IO

    深入理解Java中的IO 转载自:http://blog.csdn.net/qq_25184739/article/details/51205186 本文的目录视图如下: Java IO概要 a.Ja ...

  8. 深入java虚拟机 第四版_深入理解Java虚拟机-常用vm参数分析

    Java虚拟机深入理解系列全部文章更新中... https://blog.ouyangsihai.cn/shen-ru-li-jie-java-xu-ni-ji-java-nei-cun-qu-yu- ...

  9. java spring boot 注解验证_如何理解Java原生注解和Spring 各种注解?

    作者:digdeep .cnblogs.com/digdeep/p/4525567.html 导引 Spring中的注解大概可以分为两大类: spring的bean容器相关的注解,或者说bean工厂相 ...

最新文章

  1. elementUI源码修改的爬坑之旅
  2. MaxCompute常用语句汇总(更新ing)
  3. linux c 信号量简介
  4. 每日一皮:你不知道你的骑手为了给你送餐要经历什么...
  5. 【C++ 语言】面向对象 ( 成员函数 | 常量函数 | 友元函数 | 友元类 | 单例类 )
  6. java socket windows linux,socket在windows下和linux下的区别
  7. Java类集-SortedSet接口
  8. Git cherry-pick后再merge出现一个“奇怪”的现象
  9. C语言--结构体与内存对齐准则简单理解
  10. [计算机网络] - TCP 重传、滑动窗口、流量控制、拥塞控制
  11. C++ C++基础语法入门总结(一)命名空间-输入输出-缺省参数-函数重载
  12. liunx Swap 分区的作用
  13. Ubuntu系统下如何提交代码到GitHub
  14. 交互式电子白板android,交互式电子白板教学应用
  15. 用java生成二维码
  16. 企业IT管理基础知识巩固系列之(一)路由器
  17. 什么时候可以使用 chkdsk 命令修复U盘
  18. 【MDC智能驾驶开发者课程】1.华为MDC总体介绍
  19. 每个人来到世上,都是匆匆过客
  20. medoo支持的php版本,Medoo入门:安装和配置-Medoo使用指南

热门文章

  1. 怎么用feign远程调用别人的接口_spring cloud-openFeign声明式远程调用
  2. dlp防泄密系统卸载_浙江好用的企业图纸防泄密软件推荐,局域网内部图纸透明加密方案...
  3. JDK8特性--Stream(求和,过滤,排序)
  4. ​多分类下的ROC曲线和AUC​
  5. refineFace 笔记
  6. tensorflow兼容问题
  7. variables needed for gradient computation has been modified by an inplace operation
  8. cannot reshape array of size 5011 into shape (2)
  9. caffe 编译中出现的错误——fatal error: hdf5.h: 没有那个文件或目录
  10. ERROR LNK2019:无法解析的外部的符号 _sscanf或者_vsprintf