为什么80%的码农都做不了架构师?>>>   

其实Java的泛型和C#的泛型是一样的道理,说白了就是“类型参数化”,没什么神秘的,所以这篇就说说Java泛型的一些事!

一、泛型的好处

  1. 避免拆装箱,提高程序性能

  2. 复用代码

  3. 类型安全

二、泛型类

[访问修饰符]  class 类名<泛型1,泛型2,…> {泛型1  泛型成员1;泛型2  泛型成员2;       //....}
//此处声明了一个包含泛型T的泛型类,T代表所有可能的类型,而T的实际类型在Generic类实例化时指定。class Generic<T> {     private T f;  //f为泛型成员public void setF(T f) {//setF方法的参数类型为泛型Tthis.f = f;}     public T getF() {//getF方法的返回类型为泛型Treturn f;}
}

三、泛型接口

interface Info<T>{        // 在接口上定义泛型  public T getVar() ; // 定义抽象方法,抽象方法的返回值就是泛型类型
}
class InfoImpl<T> implements Info<T>{   // 定义泛型接口的子类  private T var ;             // 定义属性  public InfoImpl(T var){     // 通过构造方法设置属性内容  this.setVar(var) ;    }  public void setVar(T var){  this.var = var ;  }  public T getVar(){  return this.var ;  }
};
public class GenericsDemo24{  public static void main(String arsg[]){  Info<String> i = null;        // 声明接口对象  i = new InfoImpl<String>("汤姆") ;  // 通过子类实例化对象  System.out.println("内容:" + i.getVar()) ;  }
};

四、泛型方法

class Demo{  public <T> T fun(T t){            // 可以接收任意类型的数据  return t ;                  // 直接把参数返回  }
};
public class GenericsDemo26{  public static void main(String args[]){  Demo d = new Demo() ;   // 实例化Demo对象  String str = d.fun("汤姆") ; //   传递字符串  int i = d.fun(30) ;     // 传递数字,自动装箱  System.out.println(str) ;   // 输出内容  System.out.println(i) ;     // 输出内容  }
};

五、泛型通配符

  • 非受限通配:?  (它和? extends Object是一样的):适配所有的类型

  • 受限通配:? extends T  (表示T或T的一个未知子类型):限定通配符匹配类型的上限

  • 下限通配: ? super T   (表示T或T的一个未知父类型):限定通配符匹配类型的下限

注意:

多接口限制
虽然Java泛型简单的用 extends 统一的表示了原有的 extends 和 implements 的概念,但仍要遵循应用的体系,Java 只能继承一个类,但可以实现多个接口,所以你的某个类型需要用 extends 限定,且有多种类型的时候,只能存在一个是类,并且类写在第一位,接口列在后面,也就是:<T extends SomeClass & interface1 & interface2 & interface3>

这里的例子仅演示了泛型方法的类型限定,对于泛型类中类型参数的限制用完全一样的规则,只是加在类声明的头部,如:

public class Demo<T extends Comparable & Serializable>{        //T类型就可以用Comparable声明的方法和Seriablizable所拥有的特性了}

六、泛型擦除

在JAVA的虚拟机中并不存在泛型,泛型只是为了完善java体系,增加程序员编程的便捷性以及安全性而创建的一种机制,在JAVA虚拟机中对应泛型的都是确定的类型,在编写泛型代码后,java虚拟中会把这些泛型参数类型都擦除,用相应的确定类型来代替,代替的这一动作叫做类型擦除,而用于替代的类型称为原始类型,在类型擦除过程中,一般使用第一个限定的类型来替换,若无限定则使用Object.

泛型类(不带泛型限定)代码:

class Test<T>{    private T t;    public void show(T t){}
}

虚拟机进行翻译后的原始类型:

class Test
{private Object t;public void show(Object t){}
}

转载于:https://my.oschina.net/jewill/blog/412182

Java学习笔记(43)——Java泛型相关推荐

  1. Java学习笔记1:Java中有关print、println、printf的用法和区别

    Java学习笔记1:Java中有关print.println.printf的用法和区别 最近在学习java,写一些笔记记录下. 1.print()函数是一般的标准输出,但是不换行. 2.println ...

  2. Java学习笔记(java基础)

    Java学习笔记(第一周) Java 介绍 Java 发展方向 JVM , JDK , JRE 名词解释 Java语言的特点 Java安装 安装包的下载 配置环境变量 验证是否安装成功 Java的第一 ...

  3. 泛型java实例_【Java学习笔记】Java6泛型实例

    你若是不使用泛型,则会这样处理数据类型不确定的问题: class Stash { private Object x; void set(Object x) { this.x = x; } Object ...

  4. 【java】java学习笔记之java oop(面向对象)

    如下图所示为笔者总结的java oop(面向对象)学习笔记,其中,附带有代码示例(未展开),方便理解记忆.需要源文件的请到我的资源中下载,下载地址:https://download.csdn.net/ ...

  5. 【java】java学习笔记之java常用类

    如下图所示为笔者总结的java常用类学习笔记,其中,附带有代码示例(未展开),方便理解记忆.需要源文件的请到我的资源中下载,下载地址:https://download.csdn.net/downloa ...

  6. Java学习笔记 - 4 Java核心类库

    4 Java 核心类库 4.1 泛型 泛型,即"参数化类型".就是将原来具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时 ...

  7. Java 学习笔记(4)——java 常见类

    上次提前说了java中的面向对象,主要是为了使用这些常见类做打算,毕竟Java中一切都是对象,要使用一些系统提供的功能必须得通过类对象调用方法.其实Java相比于C来说强大的另一个原因是Java中提供 ...

  8. java学习笔记(一) ----java下常用的包功能

    ***java下常用的包*** java.lang----包含一些java语言的核心类,如String,Math,Integer,System,Thread,提供常用的功能. java.awt---- ...

  9. Java学习笔记-7.Java IO流

    一.输入/输出流 1.流:不同类型的输入.输出源    数据流:输入或输出的数据 Java数据流的所有接口和类都是在java.io包中定义的,因此应在程序开头加入 import java.io.* 2 ...

  10. JAVA学习笔记 03 - JAVA语言程序结构

    本文是Java基础课程的第三课.计算机语言的程序结构无外乎顺序结构.分支结构.循环结构,本文主要介绍Java语言中这些程序结构是如何实现的 文章目录 一.程序结构 二.分支结构 1.单分支if语句 2 ...

最新文章

  1. Redis 笔记(02)— keys 键相关命令(查询数据库key数量、判断key是否存在、指定key过期时间、查看key类型、查看key剩余秒数、选择数据库、删除key、删除数据库)
  2. 您必须在sources.list中指定代码源_python如何从源代码构建lxml
  3. rust(60)-opencv(1)
  4. SAP Spartacus的OccCmsPageNormalizer
  5. Python 函数的参数形式
  6. python是什么课程-python是什么(python是什么课程)
  7. 虚拟机卡在登录界面卡住了_手机都10核了 为何还是照样卡?
  8. Informatic学习总结_day03_update组件学习
  9. 【Java】Response约定
  10. 理解Window和WindowManager
  11. 手把手教你搭建Windows环境微信小程序的本地测试服务器
  12. Connection could not be established with host smtp.163.com 阿星小栈
  13. 第3章 内核编程语言与环境(2)
  14. php导出excel失败原因,PHPExcel中导出Excel出错的一种可能原因
  15. OSChina 周二乱弹 —— 对!公交车绝缘体
  16. opencv实现色彩还原(白平衡)
  17. 消息队列中间件 Message Queue 简称:MQ
  18. Git 报错:fatal: destination path ‘.‘ already exists and is not an empty directory.
  19. 专业的人脸拼接工具:Morph Age mac版
  20. 《区块链革命》读书笔记 8 克服困难:实施过程中的10个挑战

热门文章

  1. Java中获取路径的各种方法
  2. CISCO PIX/ASA Failover 技术初步学习
  3. 计算机维护方面的知识和技巧,电脑硬件维护常识和方法【图文详解】
  4. 如何恢复隐藏的窗口 已知进程名称_如何判断Linux系统是否被黑客入侵?可以用这种方法...
  5. er图转为数据流程图_draw.io for Mac(流程图绘制工具)
  6. mfc让图片与按钮一起_微信朋友圈发图片还能添加语音,简单两步就能搞定!今天学到了...
  7. python足球联赛赛程_python爬取足球比赛赛程笔记
  8. python爬取微博指定内容_python3.5爬虫-爬取微博某博主微博内容
  9. native react ssh_React Native踩坑笔记(持续更新中...)
  10. jeesite如何已生成数据的数据源_jeesite1.X 集成多数据源