浅谈Java泛型

泛型在java中占据非常重要的地位。那么,泛型是什么呢。

泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。

泛型的本质是为了参数化类型(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型)。也就是说在泛型使用过程中,操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。

这段概念有点长了,有点难懂,我们举例说下会更直观一点。
我们看下java标准库提供的ArrayList,它可以看作“可变长度”的数组,因为用起来比数组更方便。实际上ArrayList内部就是object[] 数组。

   public class ArrayList {
    private Object[] array;
    private int size;
    public void add(Object e) {...}
    public void remove(int index) {...}
    public Object get(int index) {...}
}

当我们用上面的ArrayList存储String会存在一些问题。
1、需要强制
2、在转型的过程中容易导致意想不到的错误。
例:

list.add(new Integer(2));
// ERROR: ClassCastException:
String second = (String) list.get(1);

针对这种错误,我们可以尝试解决一下。
我们尝试修改一下这个类使其满足我们的要求。如下:

   public class ArrayList {
    private String[] array;
    private int size;
    public void add(Object e) {...}
    public void remove(int index) {...}
    public Object get(int index) {...}
}

如此以来,存进去一定是String类型,取出来也一定是String,不需要强制转型。
看似问题已经解决,但是当我们存储Interger时候,我们又要重新写这个类,这是不现实,因为我们的对象是多种多样的,我们不可能每个类型都重写这个类。

所以我们需要把ArrayList变成一个模板:ArrayList。

public class ArrayList<T> {
    private T[] array;
    private int size;
    public void add(T e) {...}
    public void remove(int index) {...}
    public T get(int index) {...}
}

应用:

// 字符类型:
ArrayList<String> strList = new ArrayList<String>();
// 浮点型类型:
ArrayList<Float> floatList = new ArrayList<Float>();
// 创建可以存储Person的ArrayList:
ArrayList<Person> personList = new ArrayList<Person>();

正如这个例子,万能匹配,又通过编译器保证了类型安全:这就是泛型。

你可能感兴趣的:(java,编程语言)