1.为什么会有泛型呢?
早期的Object类型可以接受任意的对象类型,但是在实际使用中,会有类型转化的问题,存在隐患,所以Java提供泛型解决这个安全问题
2.什么是泛型?
泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。
泛型的本质是为了参数化类型(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型)。也就是说在泛型使用过程中,操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。
3.泛型的使用
泛型有三种使用方式,分别为:泛型类、泛型接口、泛型方法
(1) 泛型类
把泛型定义在类上
格式:public class类名<泛型类型,…>
注意:泛型类型 必须是引用类型

//一个泛型类
public class ObjectTool<E> {
private E obj;public E getObj() {return obj;
}public void setObj(E obj) {this.obj = obj;
}
}// 泛型类测试
public class ObjectToolDemo {
public static void main(String[] args) {ObjectTool<String> obj=new ObjectTool<String>();obj.setObj("张三");String s=obj.getObj();System.out.println(s);
}
}

(2)泛型方法
把泛型定义在方法上
格式:public<泛型类型>返回类型 方法名(泛型类型)

//泛型方法
public class ObjectTool{public <T> void show(T t) {}}
//测试
public class ObjectToolDemo {
public static void main(String[] args) {ObjectTool obj=new ObjectTool();obj.show(1);obj.show("hello");obj.show(true);}
}

(3)泛型接口
把泛型定义在接口上
格式:public interface接口名<泛型类型>

//定义泛型接口
public interface Inter<T> {
public abstract void show(T t);
}
//实现接口
public class InterfaceImpl<T> implements Inter<T>{
public static void main(String[] args) {
}
public void show(T t) {
}
}
//测试
public class InterfaceDemo {
public static void main(String[] args) {//接口测试Inter<String> i=new InterfaceImpl<String>();i.show("hello");Inter<Integer> i2=new InterfaceImpl<Integer>();i2.show(100);Inter<Boolean> i3=new InterfaceImpl<Boolean>();i3.show(true);}
}

4.泛型的好处
Java 语言中引入泛型是一个较大的功能增强。不仅语言、类型系统和编译器有了较大的变化,以支持泛型,而且类库也进行了大翻修,所以许多重要的类,比如集合框架,都已经成为泛型化的了。
1,类型安全。 泛型的主要目标是提高 Java 程序的类型安全。通过知道使用泛型定义的变量的类型限制,编译器可以在一个高得多的程度上验证类型假设。没有泛型,这些假设就只存在于程序员的头脑中(或者如果幸运的话,还存在于代码注释中)。
5. 泛型通配符

  • 泛型通配符<?>
    任意类型,如果没有明确,那么就是Object以及任意的Java类
//泛型如果明确写的时候,前后需要一致Collection<Object> c1=new ArrayList<Object>();//Collection<Object> c2=new ArrayList<Animal>();//Collection<Object> c3=new ArrayList<cat>();报错//Collection<Object> c4=new ArrayList<dog>();//?表示任意类型都是可以的Collection<?> c2=new ArrayList<Animal>();Collection<?> c3=new ArrayList<cat>();Collection<?> c4=new ArrayList<dog>();
  • ? Extends E
    向下设定,E及其子类
//? Extends ECollection<? extends Animal> c5=new ArrayList<Animal>();Collection<? extends Animal> c6=new ArrayList<dog>();Collection<? extends Animal> c7=new ArrayList<cat>();
  • ? super E
    向上设定,E及其父类
//向上设定,E及其父类Collection<? super Animal> c8=new ArrayList<Object>();Collection<? super Animal> c9=new ArrayList<Animal>();

Java之泛型,什么是泛型?为什么用泛型?(泛型详解)相关推荐

  1. Java构造和解析Json数据的两种方法详解一

    在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面首先介绍用json-lib构造和解析Jso ...

  2. Java中创建String的两道面试题及详解

    转载自 Java中创建String的两道面试题及详解 我们知道创建一个String类型的变量一般有以下两种方法: String str1 = "abcd";String str2 ...

  3. java函数式编程归约reduce概念原理 stream reduce方法详解 reduce三个参数的reduce方法如何使用

    java函数式编程归约reduce概念原理 stream reduce方法详解 reduce三个参数的reduce方法如何使用

  4. java显示参数,Java中的隐式参数和显示参数实例详解

    在学习java的过程中,我们会遇到许多的问题.下面我们就来看看什么是隐式参数和显示参数. 显式参数,就是平时见到的在方法名括号中间的参数,就是所谓能看得见的参数www.cppcns.com. 隐式参数 ...

  5. java制作海报一:java使用Graphics2D 在图片上写字,文字换行算法详解

    文章目录 前言 一.直接上代码 1. 写字方法 2. 换行算法 二. 叙述换行算法 前言 代码都上传到GitHub了,这里仅仅是贴出来主要部分,GitHub传送门:https://github.com ...

  6. WEB后台--邮件和短信业务实现(包括Java一键实现、封装和异步)以及原理详解

    本来就打算针对一些固定的特别点的业务(QQ与网易邮件.拦截设计.短信.定时器等等)来进行记录以及解析原理,这些会比较零散记录在JavaWeb的分类里面,感兴趣的童鞋可以去看下. 有人问为什么要邮件短信 ...

  7. Java泛型面试必问15题,深入详解泛型【附解答】

    泛型 什么是泛型?泛型的作用? Java 泛型(Generics)是 JDK 5 中引入的一个新特性. 使用泛型参数,可以增强代码的可读性以及稳定性.编译器可以对泛型参数进行检测,并且通过泛型参数可以 ...

  8. java 枚举使用简书_java枚举类型使用和详解

    1.定义 An enum type is a special data type that enables for a variable to be a set of predefined const ...

  9. java map中的entry_java中Map及Map.Entry详解(组图)

    java中Map及Map.Entry详解(组图) 08-22栏目:技术 TAG:map.entry map.entry Map是java中的接口,Map.Entry是Map的一个内部接口. copyr ...

  10. java集合框架的结构_集合框架(Collections Framework)详解及代码示例

    简介 集合和数组的区别: 数组存储基础数据类型,且每一个数组都只能存储一种数据类型的数据,空间不可变. 集合存储对象,一个集合中可以存储多种类型的对象.空间可变. 严格地说,集合是存储对象的引用,每个 ...

最新文章

  1. 【redis】c/c++操作redis(对于hiredis的封装)
  2. mxnet制作人脸识别训练集
  3. day06 : 01 Oracle 体系结构概念,内存结构,内存结构(服务器进程和用户进程)
  4. Ubuntu安装搜狗输入法Linux版
  5. wxWidgets:wxScopedPtr类用法
  6. C++socket编程(六):6.2 通过select实现超时处理
  7. Go语言的map以及sort
  8. matlab图片集成成视频
  9. 如何反编译微信小程序前端,30分钟教你学会
  10. word在线预览 (含doc,docx等)
  11. 无监督学习之稀疏编码,自编码
  12. 懵逼树上懵逼果:探索二分法搜索
  13. 重庆声光电安全预警平台项目启动会顺利召开
  14. 【机器学习】逻辑回归案例一:保险与年龄之间关系分析
  15. Objective-C runtime机制(5)——iOS 内存管理
  16. swiper 重新初始化
  17. 【GPS】GPS测试环境
  18. 强化学习(RL)中的Q-learning在拿奖杯游戏的表现
  19. WIN7 ftp网线直连传东西怎么设置
  20. Git和Mercurial(Hg)的分析

热门文章

  1. Unity技术-GameFramework文档系列(四)- 事件订阅
  2. UG\NX二次开发 获取所有子部件 UF_ASSEM_ask_all_part_occ_children
  3. 经典算法案例001-08:如何使用质数设计扫雷(Minesweeper)游戏
  4. c语言madplay播放音乐函数,声卡驱动程序-xiao_yan123-ChinaUnix博客
  5. 羊皮卷-羊皮卷之十(世界上最伟大的推销员)
  6. 【Python】念数字
  7. pytorch获取全部权重参数、每一层权重参数
  8. 最大子数组和——动态规划法
  9. 汽车电子软件开发:AutoSAR集成开发环境
  10. CloudSim资源调度