1.为什么要用泛型

泛型程序设计(Generic programming) 意味着编写的代码可以被很多不同类型的对象所重用

在增加泛型类之前,ArrayList类只维护一个Object引用的数组:

public class ArrayList {
    private Object[] elementData;
    ...
    public Object get(int i) {...}
    public void add(Object o) {...}
}

而这会产生两个问题:

【1】获取一个值时必须进行强制类型转换:

    ArrayList files = new ArrayList();
    // 输入后将以Object的形式保存
    files.add("e://fatmanhappycoding.txt");
    // 将获取到的Object转化成String
    String filename = (String)files.get(0);

【2】没有错误检查,可以向数组列表添加任何类的对象

往本来应该存放String的files中加入文件对象

files.add(new File("..."));

这么做在编译和运行都不会出错
但是在使用时我看不出来这个files到底是存放了String类型的对象还是File还是其他的什么对象,所以在使用时很可能会对存放了File类型对象的files执行:

String filename = (String)files.get(1); // 里面存放了File对象

此时就会产生错误
所以,泛型提供了一个解决方案:类型参数

ArrayList<String> files = new ArrayList<String>();

这样提高了可读性,使我们一看就知道里面存放了String对象

在Java SE 7后我们可以这样写: ArrayList files = new ArrayList<>();

例:

 public class ArrayList<T> {
     private T[] elementData;
     ...
     public T get(int i) {...}
     public void add(T t) {...}
}

使用上面例子中采用泛型的ArrayList:

ArrayList<String> files = new ArrayList<>();
String filename = files.get(0);

此时不用进行转换,编译器通过get方法的类型参数便知道了这是String型的,add也同理,因此,现在用add来向files添加File类型的对象则会报错

因此,泛型使得程序有更好的可读性和安全性

注:本文为《Java 核心技术 卷I》读书笔记及个人理解解释

猜你喜欢

转载自blog.csdn.net/yztfst/article/details/82534997