泛型的引入与案例

泛型引入原因:

public class ObjectTool {
    private Object obj;

    public Object getObj() {
        return obj;
    }

    public void setObj(Object obj) { // Object obj = new Integer(30);
        this.obj = obj;
    }
}

/*
 * 早期的时候,我们使用Object来代表任意的类型。
 * 向上转型是没有任何问题的,但是在向下转型的时候其实隐含了类型转换的问题。
 * 也就是说这样的程序其实并不是安全的。所以Java在JDK5后引入了泛型,提高程序的安全性。
 */
public class ObjectToolDemo {
    public static void main(String[] args) {
        ObjectTool ot = new ObjectTool();

        // 正常使用
        ot.setObj(new Integer(27));
        Integer i = (Integer) ot.getObj();
        System.out.println("年龄是:" + i);

        ot.setObj(new String("林青霞"));
        String s = (String) ot.getObj();
        System.out.println("姓名是:" + s);

        System.out.println("---------");
        ot.setObj(new Integer(30));
        // ClassCastException
        String ss = (String) ot.getObj();
        System.out.println("姓名是:" + ss);
    }
}

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------

/*
 * ArrayList存储字符串并遍历
 *
 * 我们按照正常的写法来写这个程序, 结果确出错了。
 * 为什么呢?
 *         因为我们开始存储的时候,存储了String和Integer两种类型的数据。
 *         而在遍历的时候,我们把它们都当作String类型处理的,做了转换,所以就报错了。
 * 但是呢,它在编译期间却没有告诉我们。
 * 所以,我就觉得这个设计的不好。
 * 回想一下,我们的数组
 *         String[] strArray = new String[3];
 *         strArray[0] = "hello";
 *         strArray[1] = "world";
 *         strArray[2] = 10;
 * 集合也模仿着数组的这种做法,在创建对象的时候明确元素的数据类型。这样就不会在有问题了。
 * 而这种技术被称为:泛型。
 *
 * 泛型:是一种把类型明确的工作推迟到创建对象或者调用方法的时候才去明确的特殊的类型。参数化类型,把类型当作参数一样的传递。
 * 格式:
 *         <数据类型>
 *         此处的数据类型只能是引用类型。
 * 好处:
 *         A:把运行时期的问题提前到了编译期间
 *         B:避免了强制类型转换
 *         C:优化了程序设计,解决了黄色警告线
 */
public class GenericDemo {
    public static void main(String[] args) {
        // 创建
        ArrayList<String> array = new ArrayList<String>();

        // 添加元素
        array.add("hello");
        array.add("world");
        array.add("java");
        // array.add(new Integer(100));
        //array.add(10); // JDK5以后的自动装箱  ,这样写是不会报错的,因为泛型没有写上,没有限制集合的类型。直接写10,也不会报错的原因,是自动装箱,可以通过反编译查询编译后的源码:Integer.valueOf(10);
        // 等价于:array.add(Integer.valueOf(10));

        // 遍历
        Iterator<String> it = array.iterator();
        while (it.hasNext()) {
            // ClassCastException
            // String s = (String) it.next();   //标记红色的地方,会出异常,原因是集合里面有Integer和Stirng两种引用类型,而遍历时,只管Stirng,所以到遍历Integer就会报错
            String s = it.next();
            System.out.println(s);
        }

        // 看下面这个代码
        // String[] strArray = new String[3];
        // strArray[0] = "hello";
        // strArray[1] = "world";
        // strArray[2] = 10;
    }
}

原文地址:https://www.cnblogs.com/canceler/p/4619328.html