Java泛型集合
所谓泛型就是允许在定义类、接口时指定类型形参,这个类型形参将在声明变量、创建对象时确定。增加了泛型支持后的集合,完全可以记住集合
中元素的类型,并可以在编译时检查集合中元素的类型。即解决一些安全问题,同时还可以让代码变得更加简洁。
一、使用泛型
泛型的格式:通过<>来定义要操作的引用数据类型
创建一个只存放字符串的对象,代码如下:
package com.csu.test1; import java.util.ArrayList;
import java.util.List; public class GenericDemo {
public static void main(String[] args) {
//创建一个只能保存字符串的ArrayList集合
List<String> strList=new ArrayList<String>();
//如果存放其他类型的对象时会出现编译错误
strList.add("chaofn"); System.out.println(strList);
}
}
使用泛型的好处:
1、将运行时期出现的ClassCastExcpetion , 转移到了编译时期。方便于程序员解决问题,让运行时期问题减少。
2、避免了强制转换的麻烦。
如下代码可以解释这一点:
package com.csu.test1; import java.util.ArrayList;
import java.util.Iterator;
import java.util.List; class StringDemo { String name;
public StringDemo(String name){
this.name=name; } }
public class GenericDemo { public static void main(String[] args) {
//创建一个只能保存字符串的ArrayList集合
List ls=new ArrayList();
//如果存放其他类型的对象时会出现编译错误
ls.add(new StringDemo("chaofn01"));
ls.add(new StringDemo("chaofn02"));
ls.add(new StringDemo("chaofn03"));
ls.add(new StringDemo("chaofn04"));
ls.add(1000);
MyIterator(ls); }
public static void MyIterator(List ls){
Iterator it=ls.iterator();
while(it.hasNext()){
StringDemo s=(StringDemo) it.next();
System.out.println(s.name);
}
}
}
运行结果:
chaofn01
chaofn02
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to com.csu.test1.StringDemo
at com.csu.test1.GenericDemo.MyIterator(GenericDemo.java:34)
at com.csu.test1.GenericDemo.main(GenericDemo.java:27)
chaofn03
chaofn04
在调用MyIterator(List ls) 方法时会发生ClassCastException 异常。而且在编译时是不会有任何提示,只有运行时会出现,所以使的程序存在安全隐患。
如果使用泛型则会在编译时提示错误,而且在遍历时不需要强制转换。如:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List; class StringDemo { String name;
public StringDemo(String name){
this.name=name; } }
public class GenericDemo { public static void main(String[] args) {
//创建一个只能保存字符串的ArrayList集合
List<StringDemo> ls=new ArrayList<StringDemo>();
//如果存放其他类型的对象时会出现编译错误
ls.add(new StringDemo("chaofn01"));
ls.add(new StringDemo("chaofn02"));
ls.add(new StringDemo("chaofn03"));
ls.add(new StringDemo("chaofn04"));
//下面一行代码在编译时会出错
//ls.add(1000);
MyIterator(ls); }
public static void MyIterator(List<StringDemo> ls){
Iterator<StringDemo> it=ls.iterator();
while(it.hasNext()){
//不需要强制转化成StringDemo
StringDemo s= it.next();
System.out.println(s.name);
}
}
}
二、自定义泛型类:
除了Java提供了一些类增加了泛型支持外,我们可以自定义泛型支持类。
那么在什么时候定义泛型类呢?
当类中操作的引用数据类型不确定时可以定义泛型类。
格式如下:
class Tools<T>
{
}
例如:定义一个Tools 类 用来完成打印操作,但是应为不知道要操作的数据类型是什么,所以可以定义成泛型类。具体操作:
//定义一个工具类Tools
2 //因为不知道要操作的类型是什么所以增加泛型支持
3 class Tools<T>
4 {
5 // 包含输出函数:
6 public void sop(T t)
7 {
8 System.out.println("sop:"+t);
9 }
10 }
11 //定义一个Books 类
12 class Books
13 {
14 private String name ;
15 public Books(String name)
16 {
17 this.name = name ;
18 }
19 // 重写toString 方法
20 public String toString()
21 {
22 return "name = " + name ;
23 }
24 }
25 public class GenericText
26 {
27 public static void main(String[] args)
28 {
29 // 创建一个Tools 实例tool ,定义 tool 要操作的数据类型为Books
30 Tools<Books> tool = new Tools<Books>() ;
31 // tool 可以操作 Books 类型,还可以操作Integer 类型和String类型。
32 tool.sop(new Books("神雕侠侣"));
33 }
}
泛型类定义的泛型,在整个类中有效,如果被方法使用,那么泛型类的对象明确要操作的具体类型后,所有要操作的类型就已经固定了。为了让不同方法可以操作不同类型,
而且类型还不确定,那么可以将泛型定义在方法上。
三、自定义泛型方法
定义泛型方法格式如下:
public <T> void show(T t) 注意:<>放在修饰符后面,返回值前面
{
}
//定义一个工具类Tools
2 //因为不知道要操作的类型是什么所增加泛型支持
3 class Tools<T>
4 {
5 // 包含输出函数:
6 public void sop(T t)
7 {
8 System.out.println("sop:"+t);
9 }
10 // 定义的泛型方法:
11 public <T> void show (T t)
12 {
13 System.out.println("show:"+t);
14 }
15 }
16 //定义一个Books 类
17 class Books
18 {
19 private String name ;
20 public Books(String name)
21 {
22 this.name = name ;
23 }
24 // 重写toString 方法
25 public String toString()
26 {
27 return "name = " + name ;
28 }
29 }
30 public class GenericText
31 {
32 public static void main(String[] args)
33 {
34 // 创建一个Tools 实例tool ,定义 tool 要操作的数据类型为Books
35 Tools<Books> tool = new Tools<Books>() ;
36 // tool 可以操作 Books 类型,还可以操作Integer 类型和String类型。
37 tool.sop(new Books("神雕侠侣"));
38 tool.show(new Books("神雕侠侣")) ;
39 // 下面的方法编译时会报错》、:
40 tool.sop(1000) ;
41 tool.sop("String") ;
42
43 // 但下面却不会报错,并且正常运行。
44 tool.show(1000) ;
45 tool.show("String") ;
46 }
47 }
Java泛型集合的更多相关文章
- 将java类的泛型集合转换成json对象
一般用extjs开发传输都是用json比较多,这个将来大家也许会用到... ConvertJsonUtils.java package com.sunweb.util.jsonfactory; imp ...
- java 泛型深入之Set有用工具 各种集合泛型深入使用演示样例,匿名内部类、内部类应用于泛型探讨
java 泛型深入之Set有用工具 各种集合泛型深入使用演示样例,匿名内部类.内部类应用于泛型探讨 //Sets.java package org.rui.generics.set; import j ...
- java中数组、list、泛型集合的长度
1 java中的length属性是针对数组说的,比如说你声明了一个数组,想知道这个数组的长度则用到了length这个属性. 2 java中的length()方法是针对字符串String说的,如果想看这 ...
- Java反射给泛型集合赋值
Java反射给泛型集合赋值 泛型 Java泛型简单描述下: 比如创建一个List集合,我想在里边只放Student对象信息,就需要写成 List<Student> studentList ...
- Java泛型和集合之泛型VS模板
Java的泛型很像C++中的模板,说到Java 泛型和C++中的模板的关系时,有两个重要的方面需要被考虑到:语法和语义.语法看起来是相似的,可是语义却明显是不同的. 在语法上讲,选择尖括号 是因为他 ...
- Java:泛型基础
泛型 引入泛型 传统编写的限制: 在Java中一般的类和方法,只能使用具体的类型,要么是基本数据类型,要么是自定义类型.如果要编写可以应用于多种类型的代码,这种刻板的限制就会束缚很多! 解决这种限制的 ...
- java泛型基础
泛型是Java SE 1.5的新特性, 泛型的本质是参数化类型, 也就是说所操作的数据类型被指定为一个参数. 这种参数类型可以用在类.接口和方法的创建中, 分别称为泛型类.泛型接口.泛型方法. Ja ...
- Java泛型
什么是泛型? 泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数化类型时指定的类型的一个 ...
- 关于Java泛型的使用
在目前我遇到的java项目中,泛型应用的最多的就属集合了.当要从数据库取出多个对象或者说是多条记录时,往往都要使用集合,那么为什么这么使用,或者使用时有什么要注意的地方,请关注以下内容. 感谢Wind ...
随机推荐
- KendoUI 基础:Grid 绑定template展示
Grid 绑定template展示 <div id="TodayEditorGrid" style="margin:0 10px"></div ...
- gcc编译相关tips
http://blog.csdn.net/benpaobagzb/article/details/51364005 静态库链接时搜索路径顺序: ld会去找GCC命令中的参数-L 再找gcc的环境变量L ...
- git 设置和取消代理
# 设置ss git config --global http.proxy 'socks5://127.0.0.1:1080' git config --global https.proxy 'soc ...
- 数据加密,android客户端和服务器端可共用
安卓中,不管是内网还是外网,数据的传输首要考虑就是安全问题,尤其是用户信息,以及各种密码等敏感信息. 所以说,对数据的加密是很有必要的,尤其是当下物联网蓬勃发展的今天,数据安全尤为重要. 数据加密的方 ...
- 页面重绘(repaint)和回流(reflow)
前言 页面显示到浏览器上的过程: 1.1.生成一个DOM树. 浏览器将获取到的HTML代码解析成1个DOM树,包含了所有标签,包括display:none和动态添加的节点. 1.2.生成样式结构体. ...
- ASP.NET Cookie 概述
什么是 Cookie? Cookie 是一小段文本信息,伴随着用户请求和页面在 Web 服务器和浏览器之间传递.Cookie 包含每次用户访问站点时 Web 应用程序都可以读取的信息. 例如,如果在用 ...
- 724. Find Pivot Index
Given an array of integers nums, write a method that returns the "pivot" index of this arr ...
- 了解数组中的队列方法,DOM中节点的一些操作
队列的概念 栈是一种后进先出的结构,而队列是一种先进先出的结构.如银行排队,排在前面的人先办业务然后离开,后来的人站在最后.可以用队列的push()方法插入元素到队列的末尾,可以用shift()方法删 ...
- cut 命令详解
cut 作用:按列提取文件 参数: -d 指明列分隔符 -f 选择输出的区域 -c 指定字符位置 -b :以字节为单位进行分割.这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志. -c : ...
- XCopy命令实现增量备份
xcopy XCOPY是COPY的扩展,可以把指定的目录连文件和目录结构一并拷贝,但不能拷贝系统文件:使用时源盘符.源目标路径名.源文件名至少指定一个:选用/S时对源目录下及其子目录下的所有文件进行C ...