java泛型
ArrayList list=new ArrayList();
list.add(); 原始的list可以添加任何类型的数据。
- public class BeforeGeneric {
- static class ArrayList{//泛型之前的通用程序设计
- private Object[] elements=new Object[0];
- public Object get(int i){
- return elements[i];
- }
- public void add(Object o){
- //这里的实现,只是为了演示,不具有任何参考价值
- int length=elements.length;
- Object[] newElments=new Object[length+1];
- for(int i=0;i<length;i++){
- newElments[i]=elements[i];
- }
- newElments[length]=o;
- elements=newElments;
- }
- }
- public static void main(String[] args) {
- ArrayList stringValues=new ArrayList();
- stringValues.add(1);//可以向数组中添加任何类型的对象
- //问题1——获取值时必须强制转换
- String str=(String) stringValues.get(0);
- //问题2——上述强制转型编译时不会出错,而运行时报异常java.lang.ClassCastException
- }
- }
泛型之后:
ArrayList<String> list=new ArrayList();
list.add(); 只能添加String数据类型的数据
ArrayList<Object> list=new ArrayList();
list.add(); 只能添加object类型数据
泛型之后无论你在<>里面添加什么数据,最后他都调用了原始的ArrayList,其实就是伪泛型。尖括号的作用是知道你要往数组添加的数据类型,让你往里面添加的数据都是一致的。使用的时候就不会出现错误。
如果没有尖括号标识的判断的话,你想建立一个String数组,但你可以往数组添加任何数据,当你添加了integer,添加没问题,但是使用的时候,获取的是String,需要强转,integer转成String的时候就会有错误。(后续更新)
查看了数组的源代码我们可以知道,里面的是object,当使用泛型定义的时候,原始类就会自动将尖括号里面的类型替换掉Object,从而初始化。
参考了:http://blog.csdn.net/sunxianghuang/article/details/51982979