泛型的简介:
泛型:标签
举例:中药店每个抽屉外面贴着标签;超市购物架上有很多瓶子,每个瓶子装着什么有标签
泛型的设计背景:
集合容器类在设计阶段、声明阶段不能确定这个容器到底实际存的是什么类型的对象,多以在JDK1.5前只能把元素类型设计为Object,JDK1.5之后使用泛型来解决。因为这个时候除了元素的类型不确定,其他的部分是确定的,例如关于这个元素是如何保存,如何管理等是确定的,因此此时把元素类型设计成一个参数,这个类习惯参数叫做泛型。Collection<E>,List<E>,ArrayList<E>这个<E>就是类型参数,即泛型。
泛型的概念:
1)所谓泛型,就是允许在定义类、接口时通过一个标识表示类中某个属性的类型或者是某个方法的返回值及参数类型。这个类型参数将在使用时(例如,继承或实现这个接口,用着类型声明、创建对象时)确定(即传入实际的类型参数,也成为类型实参)。
2)从JDK1.5以后,Java引入了“参数化类型(Parameterized type)”的概念,允许我们在创建集合时再指定集合元素的类型,正如:List<String>,这表明该List只能保存字符串类型的对象。
3)JDK1.5改写了集合框架中的全部接口和类,为这些接口、类增加了泛型支持,从而可以再声明集合遍历、创建集合对象时传入类型实参。
为什么要有泛型,直接Object不是也可以存储数据:
1)解决元素存储的安全性问题,好比商品、药品标签,不会弄错。
2)解决获取数据元素时,需要类型强制转换的问题,好比不用每回拿商品、药品都要辨别。
泛型的使用:
1.jdk 5.0新增的特性
2.在集合中使用泛型:
总结:
1)集合接口或集合类在jdk5.0时都修改为带泛型的结构
2)在实例化集合类时,可以指明具体的泛型类型
3)指明完以后,在集合类或接口中凡是定义类或接口时,内部结构(比如:方法、构造器、属性等)使用到类的泛型的位置,都指定为实例化的泛型类型 比如:add(E e) --->实例化以后:add(Integer e)
4)注意点:泛型的类型必须是类,不能是基本数据类型。需要用到基本数据类型的位置,拿包装类替换
5)如果实例化时没有指明泛型的类型。默认类型为java.lang.Object类型
3.如何自定义泛型结构:泛型类、泛型接口、泛型方法。
import org.junit.Test;
import java.util.*;
import java.util.Map.*;
/*泛型的使用:
1.jdk 5.0新增的特性
2.在集合中使用泛型:
总结:
1)集合接口或集合类在jdk5.0时都修改为带泛型的结构
2)在实例化集合类时,可以指明具体的泛型类型
3)指明完以后,在集合类或接口中凡是定义类或接口时,内部结构(比如:方法、构造器、属性等)使用到类的泛型的位置,都指定为实例化的泛型类型
比如:add(E e) --->实例化以后:add(Integer e)
4)注意点:泛型的类型必须是类,不能是基本数据类型。需要用到基本数据类型的位置,拿包装类替换
5)如果实例化时没有指明泛型的类型。默认类型为java.lang.Object类型
*
*/
public class GenericTest {
//在集合中使用泛型之前的情况
@Test
public void test1(){
ArrayList list=new ArrayList();
//需求:存放学生的成绩
list.add(78);
list.add(76);
list.add(89);
list.add(88);
//问题一:类型不安全
list.add("Tom");
for(Object score:list){
//问题二:强转时,可能出现ClassCastException
int stuScore=(int)score;
System.out.println(stuScore);
}
}
//在集合中使用泛型的情况:以ArrayList为例子
@Test
public void test2(){
ArrayList<Integer> list=new ArrayList<Integer>();
//jdk7新特性:类型推断
//ArrayList<Integer> list=new ArraList<>();
list.add(78);
list.add(78);
list.add(78);
list.add(78);
//编译时,就会进行类型检查,保证数据的安全
//list.add("Tom");
//方式一:
for(Integer score:list){
//避免了强转操作
int stuScore=score;
System.out.println(stuScore);
}
//方式二
Iterator<Integer> iterator=list.iterator();
while(iterator.hasNext()){
int stuScore=iterator.next();
System.out.println(stuScore);
}
}
//在集合中使用泛型的情况:以HashMap为例
@Test
public void test3(){
Map<String,Integer> map=new HashMap<String,Integer>();
map.put("Tom",87);
map.put("Jerry",87);
map.put("Jack",67);
//map.put(123,"ABC");
//泛型的嵌套
Set<Map.Entry<String,Integer>> entry=map.entrySet();
Iterator<Map.Entry<String,Integer>> iterator=entry.iterator();
while (iterator.hasNext()){
Map.Entry<String,Integer> e=iterator.next();
String key=e.getKey();
Integer value=e.getValue();
System.out.println(key+"---"+value);
}
}
}
eg:employee练习题改写泛型
//MyDate.java
public class MyDate implements Comparable<MyDate>{
private int year;
private int month;
private int day;
public MyDate() {
}
public MyDate(int year, int month, int day) {
this.year = year;
this.month = month;
this.day = day;
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
public int getMonth() {
return month;
}
public void setMonth(int month) {
this.month = month;
}
public int getDay() {
return day;
}
public void setDay(int day) {
this.day = day;
}
@Override
public String toString() {
return "MyDate{" +
"year=" + year +
", month=" + month +
", day=" + day +
'}';
}
//@Override
//public int compareTo(Object o) {
//if(o instanceof MyDate){
//MyDate m=(MyDate) o;
//比较年
//int minusYear=this.getYear()-m.getYear();
//if(minusYear!=0){
//return minusYear;