泛型集合


泛型集合不是指某种集合,而是指在集合的基础上增加了泛型。

泛型集合中,一旦传入了泛型参数“类A”;则只能向这个集合中添加类A或类A子类的对象,不能添加其他对象了。

从泛型集合中获取对象时,对象的类型是类A,而不是Object类型的对象了。


泛型List


例如:上面说到的两种List集合,都可以加入泛型


package collection.list.arrayList;
import java.util.ArrayList;
import java.util.List;
/**
 * 演示泛型集合的使用
 * @author 学霸联盟 - 赵灿
 */
public class GenericListDemo {
	public static void main(String[] args) {
		//创建对象
		Father f = new Father();
		Son s = new Son();
		/******************* 未使用泛型的集合 ********************/
		//父类List的引用指向子类ArrayList的对象,多态的应用
		List list = new ArrayList();
		//将上面创建的两个对象加入到集合中
		//任何对象都可加入
		list.add(f);
		list.add(s);
		//想要使用对象中特有的成员时,必须强制类型转换
		Father f1 = (Father) list.get(0);
		f1.work();
		Son s1 = (Son) list.get(1);
		s1.play();
		
		/******************* 使用了泛型的集合 ********************/
		System.out.println("-----------------------------");
		/*
		 * 创建泛型集合对象,可以使用ArrayList,也可以使用LinkedList
		 * 注意:
		 * 1、泛型只能使用引用类型,不能使用基本数据类型
		 * 例如:List<int>是错误的
		 * 2、List<Father>和ArrayList<Father>存在继承关系
		 * 但是ArrayList<Father>和ArrayList<Son>是完全不同的两种类型
		 * 也不存在继承关系
		 * 例如:List<Father> fatherList = new ArrayList<Son>();
		 * ArrayList<Father> fatherList = new ArrayList<Son>();
		 * 都是错误的
		 */
		List<Father> fatherList = new ArrayList<Father>();
		List<Son> sonList = new ArrayList<Son>();
		//使用泛型后,该fatherList集合只能存储Father类型
		//除了Father以外的任何类型都不能添加到该集合中
		fatherList.add(f);
		//使用泛型后,该sonList集合只能存储Son类型
		sonList.add(s);
		
		//获取元素时无需强制类型转换
		Father f2 = fatherList.get(0);
		f2.work();
		Son s2 = sonList.get(0);
		s2.play();
	}
}
class Father{
	public void work(){
		System.out.println("工作");
	}
}
class Son extends Father{
	public void play(){
		System.out.println("玩耍");
	}
}
运行结果:
工作
玩耍
-----------------------------
工作
玩耍



泛型Set



package collection.set.hashSet;
import java.util.HashSet;
import java.util.Set;
/**
 * 演示泛型Set集合
 * 
 * @author 学霸联盟 - 赵灿
 */
public class GenericSetDemo {
	public static void main(String[] args) {
		//创建HashSet对象
		Set<String> set = new HashSet<String>();
		//泛型规定只能加入String类型,所以此处不能加入其他类型的元素
		set.add("张三");
		set.add("李四");
		set.add("张三");
		//使用了泛型String类型,所以此处泛型集合set中取出的就是String类型
		for(String str : set){
			System.out.println(str);
		}
	}
}
运行结果:
李四
张三



泛型Map



package map.hashMap;
import java.util.HashMap;
import java.util.Map;
/**
 * 演示加入泛型后的Map集合
 * 
 * 当使用多个泛型,占位符中间使用英文格式的逗号隔开
 * 例如:Map<K,V>
 * 使用时也是按照位置顺序对应传入
 * 例如:Map<String,Integer>
 * 其Map类中所有的K都会被替换成String
 * 所有的V都会被替换成Integer
 * 当想集合中存储值是也要对应数据类型
 * 
 * @author 学霸联盟 - 赵灿
 */
public class GenericMapDemo {
	public static void main(String[] args) {
		//创建泛型Map
		Map<String,Integer> map = new HashMap<String,Integer>();
		/*
		 * 由于创建对象map时使用了泛型
		 * 所以添加值时只能添加对应的数据类型值
		 */
		map.put("张三", 18);
		map.put("李四", 26);
		map.put("王五", 23);
		/*
		 * 根据key的值获取对应value的值
		 * 使用泛型后无需强制类型转换
		 */
		int age = map.get("张三");
		System.out.println("张三的年龄是:" + age);
	}
}
运行结果:张三的年龄是:18



泛型集合总结


语法格式:集合类名A<类名B> 

作用:集合A中只能存储类型B的数据

        声明并创建对象:List<String> list = new ArrayList<String>()

注意:1、集合<父类> 和 集合<子类> 是不兼容的两种类型

     2、集合<父类> 的对象中,可以存储子类对象;反之,则不能通过

     3、加入泛型集合中的元素类型,只能是泛型规定的类型或其子类

              4、从泛型集合中取出元素的类型,就是泛型规定的类型