36_入门泛型的根本应用

36_入门泛型的基本应用
  • 了解泛型

    • ArrayList<E>类定义和ArrayList<Integer>类引用中涉及如下术语:
      • 整个称为ArrayList<E> 泛型类型
      • ArrayList<E>中的E称为类型变量类型参数
      • 整个ArrayList<Integer>称为参数化的类型
      • ArrayList<Integer>中的Integer称为类型参数的实例实际类型参数
      • ArrayList<Integer>中的<>typeof
      • ArrayList称为原始类型
    • 参数化类型与原始类型的兼容性:
      • 参数化类型可以应用一个原始类型的对象,编译报告警告,例如,
Collection<String> c=new Vector();//可不可以,不就是编译器一句话的事吗?肯定可以,不然jdk1.4返回的集合就没法用了
      • 原始类型可以引用一个参数化类型的对象,编译报告警告,例如,

Collection c=new Vector<String>();//原来的方法接受一个集合参数,新的类型也要能传进去

 

    • 参数化类型不考虑类型参数的继承关系:
      • Vector<String> v=new Vector<Object>();//错误  不写<Object>没错,写了就是明知故犯
        Vector<Object> v=new Vector<String>();//也错误

        泛型中的类型参数严格说明集合中装载的数据类型是什么和可以加入什么类型的数据,记住:Collection<String>和Collection<Object>是两个没有转换关系的参数化的类型。

       假设Vector<String> v=new Vector<Object>();可以的话,那么以后从v中取出的对象当作Sting来用,而v实际指向的集合中可以加入任意的类型的对象;

       假设Vector<Object> v=new Vector<String>();可以的话,那么以后可以向v中加入任意的类型对象,而v实际指向的集合中只能装String类型的对象。

 

    • 在创建数组实例时,数组的元素不能使用参数化的类型,例如,下面语句有错误:

 

Vector<Integer> vectorList[]=new Vector<Integer>[10];

 

    • 思考题:下面的代码会报错误吗?
Vector v1=new Vector<String>();//原始类型=参数化的类型  没错
Vector<Object> v=v1;//参数化的类型=原始类型 没错
//没错,编译器只会一行一行的扫描代码,第一行没错,第二行也没错

 

泛型入门案例:

package com.itcast.day2;

import java.lang.reflect.Constructor;
import java.util.ArrayList;
import java.util.List;

/**
 * 泛型入门
 * 
 * @author ljl
 * 
 */
public class GernericTest {

    public static void main(String[] args) throws Exception {

        /**
         * 不使用泛型时,eclipse中的黄色警告 Multiple markers at this line - ArrayList is a
         * raw type. References to generic type ArrayList<E> should be
         * parameterized 翻译:ArrayList是一个原始类型,参照泛型类型,ArrayList<E>应该被参数化。
         */
        ArrayList list = new ArrayList();
        list.add(1);
        list.add(1L);
        list.add("abc");
        // 运行期异常--类型转换: java.lang.ClassCastException: java.lang.String cannot be
        // cast to java.lang.Integer
        int i = (Integer) list.get(2);

        /** 使用了泛型 ***/
        List<String> list2 = new ArrayList<String>();
        list2.add("abc");
        // list2.add(1);//编译报错。
        // list2.add(1L);//编译报错。

        // java.lang.ClassCastException: java.lang.String cannot be cast to
        // java.lang.Integer
        // int i=(Integer)list2.get(0);//编译报错。
        String str = list2.get(0);
        System.out.println(str);// abc

        /** 反射中泛型的使用 ***/
        // 01.Constructor未使用泛型,构造对象完毕之后不知道是String
        
        /**不使用泛型时,eclipse中的黄色警告
         * Constructor is a raw type. References to generic type Constructor<T> should be parameterized
         * 翻译:Constructor是一个原始类型,应该参照泛型类Contructor<T>来参数化.
         */
        Constructor constructor = String.class
                .getConstructor(StringBuffer.class);
        String ss = (String) constructor.newInstance(new StringBuffer("abc"));

        // 02.Constructor使用了泛型,规定好构造器的类型是Stirng类型的
        Constructor<String> constructor2 = String.class
                .getConstructor(StringBuffer.class);
        String ss2 = constructor2.newInstance(new StringBuffer("abcd"));

    }

}