Java5增加泛型支持,很大程度上是为了让集合记住其元素的数据类型,在此之前不用泛型的话,一旦把一个对象放进Java集合中,集合就会忘记对象的类型,把所有的对象当成Object类型处理,从集合里取出对象后,还需要进行强制类型转换
增加了泛型支持后的集合,完全可以记住集合中元素的类型,并且在编译时检查集合中元素的类型,如果试图向集合中添加不满足类型要求的对象,编译器就会提示错误,增加泛型的集合让代码更简洁更健壮

泛型基础

import static java.lang.System.*;public class ListErr
{public static void main(String[] args){// 创建一个只想保存字符串的List集合List strList = new ArrayList();strList.add("两岸猿声啼不住");strList.add("轻舟已过万重山");strList.add(5);// 引发ClassCastException异常,程序试图将Integer对象转换为String类型strList.forEach(str -> out.println(((String)str).length()));}
}

在Java5之后,引入了“参数化类型(parameterized type)”,它被称之为泛型(Generic)

import static java.lang.System.*;
public class GenericList
{public static void main(String[] args){//创建一个只想保存字符串的List集合List<String> strList = new ArrayList<String>();strList.add("古道西风瘦马");strList.add("断肠人在天涯");strList.add(5);strList.forEach(str ->out.println(strList.length()));}
}

在集合接口、类后增加尖括号,尖括号里放一个数据类型,表明该集合接口、集合类只能保存这个数据类型的对象

  • List:该List是带一个类型参数的泛型接口,类型参数是String
  • ArrayList():创建这个ArrayList对象时也指定了类型参数
  • 也因此最后的out.println里已经不需要进行强制类型转换,因为strList已经记住了该集合里对象的类型是String类型

菱形语法

在Java7之前,如果使用带泛型的接口、类定义变量,那么调用构造器创建对象时构造器的后面也必须带泛型,例如:

List<String> strList = new ArrayList<String>();
Map<String, Integer> score = new HashMap<String, Integer>();

从Java7开始,Java允许在构造器后不要带完整的泛型信息,只要给出一堆尖括号即可

List<String> strList = new ArrayList<>();
Map<String, Integer> score = new HashMap<>();

两个尖括号里什么都不放,并排挨着放一起非常像一个菱形,这种语法也就被称为菱形语法,实际上对原有的泛型并没有改变,只是更好的进行了简化

import java.util.*;
import static java.lang.System.*;public class DiamondTest
{public static void main(String[] args){// Java自动推断出ArrayList的<>里应该是StringList<String> books = new ArrayList<>();books.add("铁道旁赤脚追晚霞");books.add("玻璃珠铁壳英雄卡");// 遍历books集合,集合元素就是String类型books.forEach(ele -> out.println(ele.length()));// Java自动推断出HashMap的<>里应该是String, List<String>Map<String, List<String>> schoolsInfo = new HashMap<>();// Java自动推断出ArrayList的<>里应该是StringList<String> schools = new ArrayList<>();schools.add("这是个旅途");schools.add("一个叫做命运的慢慢旅途");schoolsInfo.put("炊烟袅袅升起", schools);// 遍历Map时,Map的key是String类型,value是List<String>类型schoolsInfo.forEach((key, value) -> out.println(key + "-->" + value));}
}
import static java.lang.System.*;// 定义一个带泛型声明的接口
interface Foo<T>
{void test(T t);
}
public class AnnoymousDiamond
{public static void main(String[] args){// 指定Foo类中泛型为StringFoo<String> f = new Foo<>(){// test()方法的参数类型为Stringpublic void test(String t){out.println("test方法的t参数为:" + t);}};// 使用泛型通配符,此时相当于通配符的上限为ObjectFoo<?> fo = new Foo<>(){// test()方法的参数类型为Objectpublic void test(Object t){out.println("test方法的Object参数为:" + t);}};// 使用泛型通配符,此处写法表示通配符的上限为NumberFoo<? extends Number> fn = new Foo<>(){// 此时test()方法的参数类型为Numberpublic void test(Number t){out.println("test方法的Number参数为:" + t);}};}
}

Java面向对象系列[v1.0.0][泛型基础]相关推荐

  1. Java面向对象系列[v1.0.0][泛型进阶]

    所谓泛型,就是允许在定义类.接口.方法时使用类型形参,这个类型形参(或者叫泛型)将在声明变量.创建对象.调用方法时动态地指定(即传入实际的类型参数也可称为类型实参) Java5改写了集合框架中的全部接 ...

  2. Java面向对象系列[v1.0.0][类加载器]

    类加载器负责将.class文件加载到内存中,并为它生成对应的java.lang.Class对象 类加载机制 类加载器负责加载所有的类,并未所有被载入内存中的类生成一个java.lang.Class实例 ...

  3. Java面向对象系列[v1.0.0][SQL语法之DDL]

    SQL语法基础 SQL全称是Structured Query Language也就是结构化查询语言,它是操作和检索关系数据库的标准语言,标准的SQL语句可以用于操作任何关系数据库,标准的SQL语句通常 ...

  4. Java面向对象系列[v1.0.0][SQL语法之数据库约束]

    数据库约束 所有关系型数据库都支持对数据表使用约束,在表面上是强制执行的数据校验规则,通过约束可以更好的的保证数据表里数据的完整性 大部分数据库支持5中完整性约束 NOT NULL:非空约束,指定某列 ...

  5. Java自动化测试系列[v1.0.0][TestNG测试开发环境配置]

    基于之前写的一篇文章Java自动化测试系列[v1.0.0][Maven开发环境]的基础上,阐述如何配置单元测试框架TestNG的测试开发环境 创建Maven项目 启动IDEA,点击Create New ...

  6. 阿里巴巴Java开发手册v1.2.0版

    最近在忙毕设,读了阿里java开发手册后,发现可以更好的读懂别人的代码了,一些文件之间的关系通过命名就能看出了.对自己养成良好的编码风格也有极大的帮助. 本手册仅供大家交流.学习及研究使用,禁止用于商 ...

  7. 阿里巴巴Java开发手册v1.2.0网页版

    前言 一 .编程规约 ( 一 ) 命名风格 ( 二 ) 常量定义 ( 三 ) 代码格式 ( 四 ) OOP规约 ( 五 ) 集合处理 ( 六 ) 并发处理 ( 七 ) 控制语句 ( 八 ) 注释规约 ...

  8. Java自动化测试系列[v1.0.0][ZTestReport测试报告]

    获取报告框架 ZTestReport 源码Clone地址为ZTestReport ,其中ZTestReport.java和其template是我们需要的关键 修改报告框架 根据我的需要,在源码基础上进 ...

  9. Java自动化测试系列[v1.0.0][自动化测试框架理念]

    自动化测试含义 在自动化测试领域内流传着一个说法:单元测试才是自动化测试的核心,在自动化测试里,无论框架何等完美都不可能脱离单元测试,单元测试将会是自动化测试里最小的单位,把它看作单位一,若干个单位一 ...

最新文章

  1. DllMain中不当操作导致死锁问题的分析--导致DllMain中死锁的关键隐藏因子2
  2. linux下删除乱码文件、目录
  3. python怎么用excel-用Python控制Excel实现自动化办公,手把手教你
  4. centos7修改服务器密码,centos7 上搭建MQTT服务器,修改密码,设置权限并进行测试。...
  5. [Silverlight]常见问题
  6. Lync 小技巧-47-错误-44009-引起-证书-规划-Lync与UM
  7. matlab的exec程序,C++调用Matlab画图的一段程序
  8. 数据结构(五)堆排序
  9. 存储专家论IP存储现实可行性
  10. 转载:linux驱动层到应用层的重要接口sys文件系统---/sys目录详解
  11. UItextView使用详解
  12. 2021-06-06滚动条de面板
  13. 学习ARM64页表转换流程
  14. [轉]快速理解VirtualBox的四种网络连接方式
  15. web前端笔试试题一(含答案)
  16. SpringCloud七:配置中心Eureka+Config+Bus+RabbitMQ
  17. Angular6 + My97DatePicker时间选择器实现数据双向绑定
  18. 科普一下: 关于C语言中的运算符优先级
  19. 有关Windows10中诊断和反馈隐私设置
  20. 【音视频基础】(一):显示器是如何显示图形数据的一

热门文章

  1. 【嵌入式操作系统】实验2:GPIO编程及应用
  2. 巧用CSS3之进击的青豆
  3. mybatis学习(四)连接池、事务、动态SQL、多表查询
  4. 用户表 角色表 部门表 级联菜单
  5. Python3 L11
  6. RedHat红帽认证---RHCE
  7. python语言雪花_python实现雪花飘落效果实例讲解
  8. 万字总结,体系化带你全面认识 Nginx !
  9. 春季开学必备物品清单、数码好物推荐篇
  10. 智慧停车场-车牌识别自动计费系统