Java 泛型 (Generics)
泛型:就是变量类型的参数化
泛型是JDK1.5中的一个最重要的特征。通过引入泛型,我们将获得编译时类型的安全和运行时更小的抛出ClassCastException的可能。
public class ArrayListTest {
	public static void main(String[] args) {
		List list = new ArrayList();
		list.add("Nick");
		list.add(new Integer(20));
		list.add(new Boolean(false));
		String str = (String) list.get(0);
		Integer in = (Integer)list.get(1);
		String b = (String)list.get(2);
	}
}
运行后,String b = (String)list.get(2);将抛出异常
Exception in thread "main" java.lang.ClassCastException: java.lang.Boolean cannot be cast to java.lang.String
at com.example.fanxing.ArrayListTest.main(ArrayListTest.java:16)
定义两个类,如下图

以上两个类结构时一致的,如果在增加一种类型,如String,还需要创建StringDemo类。
可以优化成一个类统一处理:
public class ObjectDemo {
	private Object falg ;
	public Object getFalg() {
		return falg;
	}
	public void Integer(Object falg) {
		this.falg = falg;
	}
}
然后使用ObjectDemo
public static void main(String[] args) {
		ObjectDemo obj1 = new ObjectDemo();
		obj1.SetFlag("Nick");
		String falg = (String)obj1.getFalg();
		System.out.println("falg:" + falg);
		ObjectDemo obj2 = new ObjectDemo();
		obj2.SetFlag(new Integer(20));
		Integer falg2 = (Integer)obj2.getFalg();
		System.out.println("falg2:" + falg2);
		String falg3 = (String)obj2.getFalg();
		System.out.println("falg3:" + falg3);
	}
然后String falg3 = (String)obj2.getFalg();异常
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
at com.example.fanxing.ObjectDemo.main(ObjectDemo.java:27)
2、泛型的使用
public class GenericFlag<T> {
	private T  flag;
	public T getFlag() {
		return flag;
	}
	public void setFlag(T flag) {
		this.flag = flag;
	}
	public static void main(String[] args) {
		GenericFlag<Boolean> flag1 = new GenericFlag<Boolean>();
		flag1.setFlag(new Boolean(false));
		GenericFlag<Integer> flag2 = new GenericFlag<Integer>();
		flag2.setFlag(new Integer(20));
		Boolean f1 = flag1.getFlag();
		System.out.println("f1: " + f1);
		Integer f2 = flag2.getFlag();
		System.out.println("f2: " + f2);
	}
}
3、两个泛型的实现方式
public class Generic<T1, T2> {
	private T1 flag1;
	private T2 flag2;
	public T1 getFlag1() {
		return flag1;
	}
	public void setFlag1(T1 flag1) {
		this.flag1 = flag1;
	}
	public T2 getFlag2() {
		return flag2;
	}
	public void setFlag2(T2 flag2) {
		this.flag2 = flag2;
	}
	public static void main(String[] args) {
		Generic<Integer, Boolean> flag = new Generic<Integer, Boolean>();
		flag.setFlag1(new Integer(20));
		flag.setFlag2(new Boolean(false));
		System.out.println(flag.getFlag1());
		System.out.println(flag.getFlag2());
	}
}
4、数组类型的泛型
public class Generic2<T> {
	private T[] flagArray;
	public T[] getFlagArray() {
		return flagArray;
	}
	public void setFlagArray(T[] flagArray) {
		this.flagArray = flagArray;
	}
	public static void main(String[] args) {
		Generic2<String> flag = new Generic2<String>();
		String[] str1 = {"Nick","Tom","Larry"};
		String[] str2 = null;
		flag.setFlagArray(str1);
		str2 = flag.getFlagArray();
		for(int i = 0; i< str2.length ; i++){
			System.out.println(str2[i]);
		}
	}
}
5、模拟ArrayList功能
public class SimpleCollection<T> {
	private T[] objArr;
	private int index = 0;
	public SimpleCollection() {
		objArr = (T[]) new Object[10];
	}
	public SimpleCollection(int capacity) {
		objArr = (T[]) new Object[capacity];
	}
	public void  add(T t) {
		objArr[index++] = t;
	}
	public int getLength() {
		return this.index;
	}
	public T get(int i){
		return objArr[i];
	}
	public static void main(String[] args) {
		SimpleCollection<Integer> s = new SimpleCollection<Integer>();
		for(int i = 0; i < 10; i++){
			s.add(new Integer(i));
		}
		for(int i = 0; i < 10; i++){
			Integer in = s.get(i);
			System.out.println(in);
		}
	}
}
打印结果
0
1
2
3
4
5
6
7
8
9
6、泛型的泛型
/**
* 泛型的泛型
*
*/
public class WrapperFlag<T> {
private GenericFlag3<T> flag; public GenericFlag3<T> getFlag() {
return flag;
} public void setFlag(GenericFlag3<T> flag) {
this.flag = flag;
} public static void main(String[] args) {
GenericFlag3<Integer> flag = new GenericFlag3<Integer>();
flag.setFlag(100); WrapperFlag<Integer> wrapperFlag = new WrapperFlag<Integer>();
wrapperFlag.setFlag(flag); GenericFlag3<Integer> g = wrapperFlag.getFlag();
System.out.println(g.getFlag());
} } class GenericFlag3<T>{
private T flag; public T getFlag() {
return flag;
} public void setFlag(T flag) {
this.flag = flag;
} }
6、Set泛型
public class SetTest {
	public static void main(String[] args) {
		Set<String> set = new HashSet<String>();
		set.add("a1");
		set.add("a2");
		set.add("a3");
		for(Iterator<String> iterator = set.iterator(); iterator.hasNext();){
			String value = iterator.next();
			System.out.println(value);
		}
	}
}
7、Set泛型,类型为对象Student
public class SetTest {
	public static void main(String[] args) {
		Set<Student> set2 = new HashSet<Student>();
		set2.add(new Student("tom", 20, "shanghai"));
		set2.add(new Student("Jack", 30, "ShangHai"));
		set2.add(new Student("Nick", 40, "YunNan"));
		for(Iterator<Student> iterator = set2.iterator(); iterator.hasNext();){
			Student student = iterator.next();
			String name = student.getName();
			int age = student.getAge();
			String address = student.getAddress();
			System.out.println(name + "," + age +"," + address);
		}
	}
}
class Student{
	private String name;
	private int age;
	private String address;
	public Student(String name, int age, String address) {
		this.name = name;
		this.age = age;
		this.address = address;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((address == null) ? 0 : address.hashCode());
		result = prime * result + age;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Student other = (Student) obj;
		if (address == null) {
			if (other.address != null)
				return false;
		} else if (!address.equals(other.address))
			return false;
		if (age != other.age)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}
}
8、Map泛型
public class MapTest {
	public static void main(String[] args) {
		Map<String, String> map  = new HashMap<String, String>();
		map.put("a", "aa");
		map.put("b", "bb");
		map.put("c", "cc");
		map.put("d", "dd");
		//方式一
		Set<String> set = map.keySet();
		for(Iterator<String> iter = set.iterator(); iter.hasNext();){
			String key = iter.next();
			String value = map.get(key);
			System.out.println("key:" + key + " value:" + value);
		}
		System.out.println("--------------------");
		//方式二
		Set<Map.Entry<String, String>> entriesSet = map.entrySet();
		for(Iterator<Map.Entry<String, String>> iter = entriesSet.iterator(); iter.hasNext();){
			Map.Entry<String, String> entry = iter.next();
			String key = entry.getKey();
			String value = entry.getValue();
			System.out.println("key:" + key + " value:" + value);	
		}
	}
}
Java 泛型 (Generics)的更多相关文章
- Java 泛型(Generics)
		Generics, 类似C++中的模版. 允许在定义类和接口的时候使用类型参数(type parameters), 声明的类型参数在使用的时候用具体的类型来替换. 如 ArrayList<Str ... 
- Java 泛型(Generics) 综述
		一. 引子 一般的类和方法.仅仅能使用详细类型:要么是基本类型.要么是自己定义类型.假设要编写能够应用于多种类型的代码,这样的刻板的限制对代码的束缚就会非常大. 多态算是一种泛化机制,但对代码的约束还 ... 
- 【Java心得总结三】Java泛型上——初识泛型
		一.函数参数与泛型比较 泛型(generics),从字面的意思理解就是泛化的类型,即参数化类型.泛型的作用是什么,这里与函数参数做一个比较: 无参数的函数: public int[] newIntAr ... 
- Java深度历险(五)——Java泛型
		作者 成富 发布于 2011年3月3日 | 注意:QCon全球软件开发大会(北京)2016年4月21-23日,了解更多详情!17 讨论 分享到:微博微信FacebookTwitter有道云笔记邮件 ... 
- Java泛型学习笔记 - (七)浅析泛型中通配符的使用
		一.基本概念:在学习Java泛型的过程中, 通配符是较难理解的一部分. 主要有以下三类:1. 无边界的通配符(Unbounded Wildcards), 就是<?>, 比如List< ... 
- java 深度探险 java 泛型
		Java泛型(generics)是JDK 5中引入的一个新特性,允许在定义类和接口的时候使用类型参数(type parameter).声明的类型参数在使用时用具体的类型来替换.泛型最主要的应用是在JD ... 
- Java泛型总结
		1. 什么是泛型?泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数化类型时指定的类型的 ... 
- Java泛型的好处
		java 泛型是java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口.泛型方法. ... 
- java泛型的讲解
		java泛型 什么是泛型? 泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数化类型时指 ... 
- java 泛型深入之Set有用工具 各种集合泛型深入使用演示样例,匿名内部类、内部类应用于泛型探讨
		java 泛型深入之Set有用工具 各种集合泛型深入使用演示样例,匿名内部类.内部类应用于泛型探讨 //Sets.java package org.rui.generics.set; import j ... 
随机推荐
- Python学习日记(十四) 正则表达式和re模块
			正则表达式: 它是字符串的一种匹配模式,用来处理字符串,可以极大地减轻处理一些复杂字符串的代码量 字符组:它是在同一位置可能出现的各种字符组成了一个字符组,用[]表示,但是它的结果只能是一个数字或者一 ... 
- UTF-8 中文编码范围
			主流的匹配字符有两种 [\u4e00-\u9fa5]和[\u2E80-\u9FFF],后者范围更广,包括了日韩地区的汉字 import re pattern = re.compile("[\ ... 
- Linux的环境配置文件----.bashrc文件(转)
			Linux的环境配置文件----.bashrc文件 .bashrc文件主要保存个人的一些个性化设置,如命令别名.路径等.也即在同一个服务器上,只对某个用户的个性化设置相关.它是一个隐藏文件,需要使 ... 
- UIP和lwip的区别  转载
			uIP是专门为8位和16位控制器设计的一个非常小的TCP/IP栈.完全用C编写,因此可移植到各种不同的结构和操作系统上,一个编译过的栈可以在几KB ROM或几百字节RAM中运行.uIP中还包括一个HT ... 
- 17.centos7基础学习与积累-003-命令练习01
			1.从头开始积累centos7系统运用 大牛博客:https://blog.51cto.com/yangrong/p5 linux命令的学习: 创建目录:mkdir mkdir /data mkdir ... 
- mysql字典取值,列表包含
			SELECT * FROM e where JSON_CONTAINS(json_extract(scope_detail, '$.shop'), '001'); 
- 从零开始配置MacBook Pro
			购买macbook, 是因为它的效率性.由于我第一次使用macbook,所以按照我开发的习惯和参照了其他人的文章进行配置我的个人mac,希望我的设置对你们也有所帮助 1.基本配置 查找我的Mac 系统 ... 
- c++ default关键字
			PicServer() = default; ~PicServer() = default; CString 似乎也可以写出来, https://blog.csdn.net/a1875566250 ... 
- css Grid布局
			CSS Grid 布局完全指南(图解 Grid 详细教程)https://www.html.cn/archives/8510#prop-grid-gap 5分钟学会 CSS Grid 布局https: ... 
- python  -  一键复习知识点
			## rest规范: 通过不同的 method 找到对应的 url ## Django 请求生命周期 - wsgi ,它就是socket 服务端,服务端接收用户请求并将请求初次封装,然后交给 D ... 
