您的位置:首页 > 其它

泛型(一)(浅层介绍---好处)

2016-03-23 15:08 183 查看
泛型技术的由来:

集合中可以存储任意类型对象,但是在取出时,如果要使用具体对象的特有方法时,需要进行向下转型,如果存储的对象类型不一致,在转型过程中就会出现ClassCastException异常。这样就给程序带来了不安全性。
在jdk1.5以后就有了解决方案——泛型技术:在存储元素时,就不允许存储不同类型的元素。存储了就编译失败。 所以就需要在存储元素时,在容器上明确具体的元素类型,这其实和数组定义很像。

好处:

1)将运行时期的ClassCastException异常转移到了编译时期,进行检查,并以编译失败来体现。 这样有利于程序员尽早解决问题。

2)避免了向下转型(强转)的麻烦。

什么时候写泛型呢?

只要在使用类或者接口时,该类或者接口在api文档描述时都带着<>,就需要在使用时定义泛型。

其实,泛型无非就是通过<>定义了一个形式参数,专门用于接收具体的引用类型。在使用时,一定要传递对应的实际参数类型
集合中泛型的应用特别多见。

泛型的擦除:

泛型技术是用于编译时期的技术,编译器会按照<>中的指定类型对元素进行检查,检查不匹配,就编译失败,匹配,就编译通过,通过后,生产的class文件中是没有泛型的,这就成为泛型的擦除。

泛型的补偿:

运行时,可以根据具体的元素对象获取其具体的类型,并用该类型对元素进行自动转换。

//演示泛型的好处之一:没采用泛弄,对元素的处理不安全。泛型可以把运行期的错误提前到编译期
public static void t1(){
//List list = new ArrayList();//无泛型
List<String> list = new ArrayList<String>();//无泛型
list.add("aaaqqqq");
list.add("abaqqqq");
list.add("cccqqqq");
//list.add(100); //无泛型时,此处不会报错,但有泛型时会报错。
Iterator it = list.iterator();
while(it.hasNext()){
Object obj = it.next();
String str = (String)obj;
str = str.substring(1, 4);
System.out.println(str);
}
}

//演示泛型的好处之二:从集合中读取的数据不需要强转,能够自动识别
public static void t2(){
//List list = new ArrayList();//无泛型
List<String> list = new ArrayList<String>();
list.add("aaaqqqq");
list.add("abaqqqq");
list.add("cccqqqq");
Iterator<String> it = list.iterator();
while(it.hasNext()){
//String str =(String) it.next();//无泛型,必须强转
String str = it.next();//List有泛型,并且Iterator也加泛型,那么这里就不用强转.
str = str.substring(2);
System.out.println(str);
}
System.out.println("------------");

for(Object obj:list){
System.out.println(obj);
}

//※泛型的好处之二:从集合中读取的数据不需要强转,能够自动识别
for(String str:list){
System.out.println(str);
}
}
自己可以定义一个加泛型的类

public class MySet<E> {}此时该类能接受指定的类型,E 形式类参数

public boolean add(E obj){}可以将E当做类型来用作参数,也可以当返回值

注意:不可new E,只是类的泛型参数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: