在Java增加泛型机制之前就已经有一个ArrayList
类,这个ArrayList
类的泛型概念是使用继承来实现的。
public class ArrayList {
private Object[] elementData;
public Object get(int i) {....}
public void add(Object o) {....}
}
这个类存在两个问题:
ArrayList files = new ArrayList();
files.add(new File(""));
String filename = (String)files.get(0);
对于这个调用,编译和运行都不会出错,但是当我们在其他地方使用get方法获取刚刚存入的这个File
对象强转为String
类型的时候就会产生一个错误。
泛型对于这种问题的解决方案是提供一个类型参数。
ArrayList<String> files = new ArrayList<>();
这样可以使代码具有更好的可读性,我们一看就知道这个数据列表中包含的是String
对象。编译器也可以很好地利用这个信息,当我们调用get
的时候,不需要再使用强制类型转换,编译器就知道返回值类型为String
,而不是Object
:
String filename = files.get(0);
编译器还知道ArrayList
中add
方法中有一个类型为String
的参数。这将比使用Object
类型的参数安全一些,现在编译器可以检查,避免插入错误类型的对象:
files.add(new File(""));
这样的代码是无法通过编译的,出现编译错误比类在运行时出现类的强制类型转换异常要好得多。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。