1、概述

    1.1、泛型:

        允许在   定义  类、接口、方法时  使用  类型形参,这个类型形参  将在声明变量、创建对象、调用方法时  动态地指定;

    1.2、jdk5后,引入了  参数化类型(允许程序在创建集合时指定集合元素的类型)   的概念;

    1.3、Java的参数化类型  被称为  泛型

    1.4、jdk7之前,使用带泛型的接口,调用构造器创建对象时构造器后必须带泛型;

        jdk7后,只需要带'<>'即可;

        eg:

          //jdk7之前   List<String> list=new ArrayList<String>();

          //jdk7后  List<String> list2=new ArrayList<>();

2、自定义泛型接口、泛型类

    

/**
* 自定义泛型类
* @param <T> element's type
*/
private static class Mine<T>{
//***构造器 无需加泛型
private Mine(){ }
} /**
* 自定义泛型接口
* @param <E> element
*/
private static interface My<E>{
void say();
} 使用: Mine<String> mine=new Mine<>();

3、泛型接口/类  派生子类

/**
* 自定义泛型接口
* @param <E> element
*/
private static interface My<E>{
void say();
} /**
* 泛型接口/类 派生子类
* ****泛型接口可不指定泛型类型
*/
private static class Zi implements My{
@Override
public void say() { }
} /**
* 泛型接口/类 派生子类
* ****泛型接口可指定泛型类型
*/
private static class Zi2 implements My<String>{
@Override
public void say() { }
}

4、类型通配符

    4.1、  使用 泛型类  时,都应该  为泛型类 传入一个类型实参(若没有传入类型实参,编译器会发出泛型警告);

    4.2、  Java泛型设计的原则:只要代码在编译期没有出现警告,就不会遇到运行时ClassCastException;

    4.3、  类型通配符:   是一个问号'?',将一个问号作为  类型实参  传入;   eg:List<?>

5、设定类型通配符的上限

    5.1、  有时候  不需要  作为所有类型的父类,只需要   代表某一类型的父类

/**
* 自定义泛型接口
* @param <E> element
*/
private static interface My<E>{
void say();
} /**
* 泛型接口/类 派生子类
* ****泛型接口可不指定泛型类型
*/
private static class Zi implements My{
@Override
public void say() { }
} /**
* 类型通配符上限
*/
private static class A{ public void say(List<? extends Zi> list){ } }

  

6、设定类型形参的上限

    6.1、Java支持  在定义类型形参时设定上限;

 

/**
* 设定 类型形参 上限(单个上限)
* @param <T>
*/
private static class B<T extends String>{ } /**
* 设定 类型形参 上限(多个上限)
* @param <T>
*/
private static class C<T extends String & Serializable>{ }

  

7、自定义泛型方法

    7.1、泛型方法  :

          声明方法时,定义一个或多个类型形参;

    7.2、语法:

          修饰符 <T,S> 返回值类型  方法名(形参列表){方法体...}

    7.3、与普通方法的区别:

        a,多了类型形参声明;

        b,类型形参使用<>,多个以','分隔,位于   修饰符与方法返回值之间;

/**
* 泛型方法
*/
private static class D{ private <T extends String> void say(T t){ }
}

  

8、设定通配符的下限

    8.1、super

/**
* 设定 通配符 下限
*/
private static class E{ private <T> void say(List<? super T> list){ } }

  

9、反射与泛型

    9.1、jdk5后,Java为Class类增加了泛型,eg :Class<?>;  避免使用反射生成的对象需要类型强制转换;  

 

10、泛型的优势

    1.1、编译时检测类型(避免 ClassCastException);

JavaSE---泛型系统学习的更多相关文章

  1. Dubbo -- 系统学习 笔记 -- 示例 -- 泛化引用

    Dubbo -- 系统学习 笔记 -- 目录 示例 想完整的运行起来,请参见:快速启动,这里只列出各种场景的配置方式 泛化引用 泛接口调用方式主要用于客户端没有API接口及模型类元的情况,参数及返回值 ...

  2. JavaSE 千寻简学习笔记

    JavaSE 千寻简学习笔记 简介 TIOBE:编程语言排行榜 官网:https://hellogithub.com/report/tiobe/ 如何高效的学习Java 多写(代码)多写(笔记)多写( ...

  3. 零基础如何系统学习Java Web

    零基础如何系统学习Java Web?   我来给你说一说 你要下决心,我要转行做开发,这样你才能学成. 你要会打字,我公司原来有一个程序员,打字都是两个手一指禅,身为程序员你一指禅怎么写出的代码,半个 ...

  4. Unity3D 装备系统学习Inventory Pro 2.1.2 基础篇

    前言 前一篇 Unity3D 装备系统学习Inventory Pro 2.1.2 总结 基本泛泛的对于Inventory Pro 这个插件进行了讲解,主要是想提炼下通用装备系统结构和类体系.前两天又读 ...

  5. MES系统学习

    MES系统是当今制造型企业信息化的热点,而统一建模语言UML是面向对象建模的标准语言,在软件工程发挥着重要作用.MES系统如何进行UML建模呢,今天和大家重点讨论一下MES系统的UML建模方法,请看本 ...

  6. 001 今天开始系统学习C#

    2016-01-16 之前只是大概了解过c#语言,感觉掌握不牢靠.现在开始系统学习C#.现以该博客作为学习笔记,方便后续查看.C# 目标:系统掌握c#知识 时间:30天 范围:C#基础,Winform ...

  7. Linux系统学习笔记:文件I/O

    Linux支持C语言中的标准I/O函数,同时它还提供了一套SUS标准的I/O库函数.和标准I/O不同,UNIX的I/O函数是不带缓冲的,即每个读写都调用内核中的一个系统调用.本篇总结UNIX的I/O并 ...

  8. Hibernate的系统 学习

    Hibernate的系统 学习 一.Hibernate的介绍 1.什么是Hibernate? 首先,hibernate是数据持久层的一个轻量级框架.数据持久层的框架有很多比如:iBATIS,myBat ...

  9. css系统学习网站

    最近系统学习一下css样式,找到一个不错的网站.http://css.doyoe.com/

  10. Ubuntu LTS 系统学习使用体会和实用工具软件汇总 6.04 8.04 10.04 12.04 14.04 16.04

    Ubuntu LTS 系统学习体会和工具软件汇总 6.04 8.04 10.04 12.04 14.04 16.04 ubuntu入门必备pdf:http://download.csdn.net/de ...

随机推荐

  1. 代码编译时JDK版本和运行时JDK版本不一致启动项目报错

    java编译: java编译就是.java文件变成.class文件的过程,这个过程一般在我们常用的编译器中进行,例如Ecliplse和IDEA等:下面以IDEA举例: 执行上述编译使用的JDK版本就是 ...

  2. Ubuntu - apt 下载源设置为阿里的源

    # 备份 sources.list cp /etc/apt/sources.list /etc/apt/sources.list.bak # 切换为阿里的源 echo "deb http:/ ...

  3. Python基本语法_变量作用域LEGB

    目录 目录 软件系统 变量的作用域 高级语言对数据类型的使用过程 作用域的产生 作用域的类型 Llocal局部作用域 Eenclosing嵌套作用域 Gglobal全局作用域 Bbuilt-in内置作 ...

  4. 阶段3 1.Mybatis_06.使用Mybatis完成DAO层的开发_9 typeAliases标签和package标签

    配置别名 上面制定了好了别名后,映射文件就可以简写了.不区分大小写 皆可以小写也可以大写 大小写混着也可以 测试 package 直接把com.itheima.domain下面所有的类都注册了 可以使 ...

  5. 【Linux 应用编程】基础知识

    错误提示 Linux 提供的系统调用API,通常会在失败的时候返回 -1.如果想获取更多更详细的报错信息,需要借助全局变量 errno 和 perror 函数: #include <stdio. ...

  6. eslint 修改规则 函数形参不使用报错

    函数再定义形参以后未使用就会出现报错的问题,需要设置一项eslint 规则 再.eslintrc.js   rules里面添加 "no-unused-vars": "of ...

  7. python数据分析入门(一)----安装pandas

    打算入坑, python数据分析 , 所以下载了 <利用python数据分析>的电子书, 影印版 , 14年出版的 , 现在有很多工具对不上号, 但是整体思想还是不变的 , 所以准备工作要 ...

  8. sentos7网卡改名

    一.已经装好系统CentOS7修改网卡为eth0 1. 修改网卡配置文件[root@localhost ~]# mv /etc/sysconfig/network-scripts/ifcfg-ens3 ...

  9. linux最强编辑神器vim常用命令大全:编辑、插入、删除、替换、保存...

    我说vim是编辑器之神大家没有意见吧 下面分享一些vim常用命令,大家可以收藏一下 进入vim:  vim配置: vim中光标移动: vim中屏幕滚动: vim中插入文本类: 文本替换: 格式 : 范 ...

  10. 多线程14-Barrier

    , b => Console.WriteLine());         ; i <= ; i++)             {                 Console.Write ...