Java中泛型在集合框架中的应用
泛型是Java中的一个重要概念,上一篇文章我们说过,当元素存入集合时,集合会将元素转换为Object类型存储,当取出时也是按照Object取出的,所以用get方法取出时,我们会进行强制类型转换,并且通过代码也可以看出来,我们放入其他类型时,如字符串,编译器不会报错,但是运行程序时会抛出类型错误异常,这样给开发带来很多不方便,用泛型就解决了这个麻烦
泛型规定了某个集合只能存放特定类型的属性,当添加类型与规定不一致时,编译器会直接报错,可以清楚的看到错误
当我们从List中取出元素时直接取出即可,不用类型转换,因为已经规定了里面存放的只能是某种类型
集合中中除了存入定义的泛型类型的实例,还可以存入泛型类型子类的实例
泛型不能是基本类型,只能是引用类型,如果必须使用基本类型,可以使用基本类型的包装类
对上一篇文章的例子做一个简单的优化,就很容易理解泛型啦
课程类,Course.java代码没变
/*
* 课程类,规定课程结构,用于向集合中传入此类型的元素
*/ public class Course {
public String id;
public String name;
public Course(String id,String name){
//含参构造方法
this.id = id;
this.name = name;
} public Course(){
//无参构造器,为了子类初始化隐式构造方法
}
}
课程子类,ChildCourse.java,为了测试泛型的子类型也可以存入List集合
public class ChildCourse extends Course {
//什么都不写,全部继承自父类
}
泛型测试类,TestGeneric.java
import java.util.ArrayList;
import java.util.List; public class TestGeneric { public List<Course> courses; //定义泛型类型的courses属性,规定List中元素只能是Course类型或者子类型的属性 public TestGeneric(){
this.courses = new ArrayList<Course>(); //初始化courses属性,初始化的时候也必须添加泛型
}
/*
* 向List中添加元素
*/
public void testAdd(){
Course cr1 = new Course("1","数据结构");
courses.add(cr1);
//下面添加字符串类型不符合泛型定义的类型,编译器会报错
//courses.add("string");
Course cr2 = new Course("2","Java程序设计");
courses.add(cr2);
} /*
* 遍历List中的元素输出
*/
public void testForeach(){
System.out.println("有以下课程:");
//因为courses中存储的肯定是Course类型的元素,所以直接遍历即可,不用额外操作
for(Course cr:courses){
System.out.println("课程:" + cr.id + ":" + cr.name);
}
} /*
* 测试泛型集合添加泛型子类型对象的实例
*/
public void testChild(){
ChildCourse ccr = new ChildCourse(); //子类型是不可以直接传入参数的
ccr.id = "3";
ccr.name = "我是泛型子类型课程对象";
courses.add(ccr); //添加正常
} /*
* 泛型不能使用基本类型
*/
public void testBasicType(){
//当规定泛型类型为int时,下面编译器会报错,但是使用包装类没问题
//List<int> list = new ArrayList<int>();
List<Integer> list = new ArrayList<Integer>();
list.add(1); //自动装箱,把1变为Inreger类型的
System.out.println("基本类型包装类元素:" + list.get(0));
} public static void main(String[] args) {
TestGeneric tg = new TestGeneric();
tg.testAdd();
tg.testForeach();
tg.testChild();
tg.testForeach();
tg.testBasicType();
} }
由代码可以看出对集合如何定义泛型,引用属性的添加,子类型的添加、遍历的时候更加简单了,只能添加基本类型的包装类属性
以上只是简单体现了集合如何使用泛型的属性,另外属性的修改,删除方法都基本一致,所以没有再重复一遍,其实泛型应用不止这些,确实能解决很多开发中的麻烦
Java中泛型在集合框架中的应用的更多相关文章
- Java基础---泛型、集合框架工具类:collections和Arrays
第一讲 泛型(Generic) 一.概述 1.JDK1.5版本以后出现的新特性.用于解决安全问题,是一个类型安全机制. 2.JDK1.5的集合类希望在定义集合时,明确表明你要向集合中装入那种类 ...
- Java集合框架中List接口的简单使用
Java集合框架可以简单的理解为一种放置对象的容器,和数学中的集合概念类似,Java中的集合可以存放一系列对象的引用,也可以看做是数组的提升,Java集合类是一种工具类,只有相同类型的对象引用才可以放 ...
- 第49节:Java集合框架中底层文档的List与Set
Java集合框架中的List与Set // 简书作者:达叔小生 Collection -> Set 无序不重复 -> 无序HashSet,需要排序TreeSet -> List 有序 ...
- Java集合框架中的快速失败(fail—fast)机制
fail-fast机制,即快速失败机制,是java集合框架中的一种错误检测机制.多线程下用迭代器遍历一个集合对象时,如果遍历过程中对集合对象的内容进行了修改(增加.删除),则会抛出Concurre ...
- 牛客网Java刷题知识点之Java 集合框架的构成、集合框架中的迭代器Iterator、集合框架中的集合接口Collection(List和Set)、集合框架中的Map集合
不多说,直接上干货! 集合框架中包含了大量集合接口.这些接口的实现类和操作它们的算法. 集合容器因为内部的数据结构不同,有多种具体容器. 不断的向上抽取,就形成了集合框架. Map是一次添加一对元素. ...
- Java集合框架中底层文档的List与Set
Java集合框架中的List与Set // 简书作者:达叔小生 Collection -> Set 无序不重复 -> 无序HashSet,需要排序TreeSet -> List 有序 ...
- 一起学 Java(三) 集合框架、数据结构、泛型
一.Java 集合框架 集合框架是一个用来代表和操纵集合的统一架构.所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型.接口允许集合独立操纵其代表的细节.在面向对象的语言,接口通常形成一个 ...
- 已看1.熟练的使用Java语言进行面向对象程序设计,有良好的编程习惯,熟悉常用的Java API,包括集合框架、多线程(并发编程)、I/O(NIO)、Socket、JDBC、XML、反射等。[泛型]\
1.熟练的使用Java语言进行面向对象程序设计,有良好的编程习惯,熟悉常用的Java API,包括集合框架.多线程(并发编程).I/O(NIO).Socket.JDBC.XML.反射等.[泛型]\1* ...
- Java核心技术点之集合框架
1. 概述 Java集合框架由Java类库的一系列接口.抽象类以及具体实现类组成.我们这里所说的集合就是把一组对象组织到一起,然后再根据不同的需求操纵这些数据.集合类型就是容纳这些对象的一个容 ...
随机推荐
- Solr -- 实时搜索
在solr中,实时搜索有3种方案 ①soft commit,这其实是近实时搜索,不能完全实时. ②RealTimeGet,这是实时,但只支持根据文档ID的查询. ③和第一种类似,只是触发softcom ...
- 替换文件最后一行中的所有e 为 E
#root@athena5plus:~# cat b northwest NW Charles Main 3.0 .98 3 ...
- BRIEF算法
本文结构 为了看懂ORB特征提取算法,来看了BRIEF算法的原文,并查看了OpenCV中BRIEF的相关实现,来验证论文的解读正确与否. BRIEF论文解读 摘要 用二进制串描述局部特征,好处有二:一 ...
- Codeforces 46D Parking Lot
传送门 D. Parking Lot time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- Mysql 学习-索引的设计原则
索引的设计不合理或者缺少索引都会对数据库和应用程序的性能造成障碍.高效的索引对获的良好性能非常重要.设计索引是,应该考虑一下准则: (1)索引并非语讹夺越好,若一个表中有大量索引,不仅占用磁盘空间,而 ...
- CSS3系列二(媒体支持、文字与字体相关样式、盒相关样式)
CSS3媒体支持 在css3中允许我们在不改变内容的情况下,在样式中选择一种页面的布局以精确的适应不同的设备,从而改善用户体验 可以利用meta标签在页面中指定浏览器在处理本页面时按照多少像素的窗口宽 ...
- Git Pull 避免用户名和密码方法
在开发中使用的版本控制器时git , 每次使用命令"git pull"从服务器获得最新代码时,都需要输入用户名和密码,这样浪费了大量的时间和热情,在此背景下,本文在网上找到解决版本 ...
- HD1712ACboy needs your help(纯裸分组背包)
ACboy needs your help Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
- Linux上的free命令详解
解释一下Linux上free命令的输出. 下面是free的运行结果,一共有4行.为了方便说明,我加上了列号.这样可以把free的输出看成一个二维数组FO(Free Output).例如: FO[2][ ...
- 字符串匹配的KMP算法详解及C#实现
字符串匹配是计算机的基本任务之一. 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD" ...