泛型

2018-05-16  本文已影响0人  stoneyang94

集合中的元素限定为一个特定的类型

一. 为什么需要泛型?

泛型出现之前

远在 JDK 1.4 版本的时候,那时候是没有泛型的概念的。当时 Java 程序员们写集合类的代码都是类似于下面这样:

List list = new ArrayList();
list.add("www.cnblogs.com");
list.add(23);
String name = (String)list.get(0);
Integer number = (Integer)list.get(1);

在代码中声明一个集合,我们可以往集合中放入各种各样的数据,而在取出来的时候就进行强制类型转换。但其实这样的代码存在一定隐患,因为可能过了不久我们就会忘记到底我们存放的 list 里面到底第几个是 String,第几个是 Integer 了。这样就会出现下面这样的情况:

List list = new ArrayList();
list.add("www.cnblogs.com");
list.add(23);
String name = (String)list.get(0);
String number = (String)list.get(1);    //ClassCastException

分析问题

解决办法

那么有没有什么办法可以使集合能够记住集合内元素各类型,且能够达到只要编译时不出现问题,运行时就不会出现“java.lang.ClassCastException”异常呢?答案就是使用泛型。

什么是泛型

例子

public class GenericDemo {
    public static void main(String[] args) {
        List<String> list = new ArrayList();
        list.add("datiangou");
        list.add("cimutongzi");
        for (int i = 0; i < list.size(); i++) {
            String name = list.get(i); 
            System.out.println("name "+i+" is " +name);
        }
    }
}

泛型

术语

术语 解释
ArrayList<E> 泛型类型
ArrayList 原始类型
E 类型参数
<> 读作”typeof”
ArrayList<Integer> 参数化的类型
Integer 实际类型参数

泛型的特性(擦除)

public class GenericDemo {
    public static void main(String[] args) {
        ArrayList<String> a = new ArrayList<String>();
        ArrayList<Integer> b = new ArrayList<Integer>();
        Class c1 = a.getClass();
        Class c2 = b.getClass();
        System.out.println(c1 == c2);//true
    }
}

泛型通配符

”?”通配符

?表示任意类型,使用”?”通配符可以引用各种参数化的类型,可以调用与参数化无关的方法(如size()方法),不能调用与参数化有关的方法(如add()方法)

扩展

extends 限定通配符的上边界

Integer继承自Number,编译通过:

ArrayList<? extends Number > collection1= new ArrayList<Integer >();//编译通过

String不继承自Number,编译不通过:

ArrayList<? extends Number > collection2= new ArrayList<String>();//编译不通过

super限定通配符的下边界

NumberInteger父类,编译通过:

ArrayList<? super Integer > collection3= new ArrayList<Number >();//编译通过

NumberString父类,编译通过:

ArrayList<? super Integer > collection4= new ArrayList<String>();//编译不通过

缺陷

参考文章
大白话说Java泛型:入门、使用、原理
java 泛型详解-绝对是对泛型方法讲解最详细的,没有之一
java基础巩固笔记(2)-泛型

上一篇下一篇

猜你喜欢

热点阅读