泛型的建立时间
泛型是JDK1.5以后增加的,可以帮助我们建立lexicon安全的集合---容器想让与大桶,什么都可以往里放,但是取出的时候就很困难
好处:
-
帮助我们建立类型安全的容器和集合
泛型的比喻
容器上贴标签,容器是桶。标签限定了该容器能存放的东西,,放进去的东西全都符合标签的定义
泛型的本质---一个标签、占位符
本质:
-
数据类型的参数化
把"泛型"理解为数据类型的一个占位符(形参),告诉编译器,在调用泛型时必须传入实际类型
泛型的处理是在编译器阶段,编译器帮助我们处理泛型
实例:
package com.collection;
import java.io.IOException;
import java.util.Arrays;
/**
* 测试泛型
* @author Lucifer
*/
public class TestGeneric {
public static void main(String[] args) {
MyCollection<String> mc = new MyCollection<String>(); //JDK1.7以后后面的构造器可以不加
/*
下面的泛型里面的字母"E"相当于形参
上面建对象的时候定义的<String>泛型值是实参
在下面方法使用的时候可以不写Object,可以写E
这个实际参数定义了后面的返回值类型
*/
try {
mc.set("Lucifer",0);
// mc.set(8888,1); //因为定义了实参类型,所以这个传的时候报错了
System.out.println("Successfully");
// Integer a = (Integer) mc.get(1); //因为是Integer类型,get方法中的元素都是Object类型所以要强制转型
// String b = (String) mc.get(0); //这个也要转型,因为数组里面的元素属性是Object类型
String b = mc.get(0); //返回值是String类型
/*
加了泛型定义了<String>以后这一步就不用强制转型了
*/
// System.out.println(a);
System.out.println(b);
}catch (Exception e){
e.printStackTrace();
}
}
}
/*定义一个类*/
class MyCollection<E>{
//加了泛型以后上面创建对象一环警告了---说明我们在建对象的时候后面要跟一个实际类型,在构造器后面也要加
/*定义一个object数组*/
Object[] objs = new Object[5];
/*封装往数组里面插入对象的方法*/
public void set(E obj, int index) throws Exception {
if (index < objs.length && index >= 0){
objs[index] = obj;
}
}
/*
形参是:
对象
对应的索引下标
第一次这里的判断是index>0有问题,因为索引从0开始
通过"<>"添加泛型,里面可以写参数名---自定义泛型
一般情况使用的是T,E,V三个字母
*/
/*获得的方法*/
public E get(int index){
return (E) objs[index]; //又因为objs对象是Object类型,所以要强转一下
}
}
/*
泛型的好处:
1.加了泛型以后相当于提前把类型检查的工作写到了编译器里面
2.让程序更加稳定,可读性更强
后面的容器和其他类的时候后面会经常看到泛型符号,<>里面代表的就是后期传进来的数据的内容
*/