java泛型的一些思考
为什么需要泛型
在Java中其实Object这个类已经可以解决大部分的泛型问题了,那么现在为什么还需要泛型了,一种说法是为了安全,因为在编译期使用泛型的话便可以基本确定这个参数的类型了,但是使用Object的话,由于Object是所有类型的超类,所以这会给代码造成一定的安全性问题。
1 | public void testList(T t){ |
在上面的例子中,list1由于其类型是T,这就会导致在向list1中插入数据的时候只能是泛型T,但是对于list而言,由于Object是所有类的超类,那么这个list就可以插入任何值了,所以这就导致了一些安全问题
关于Java的协变和逆变:
在Java里面数组是协变的。对于数组来讲一个Object数组是可以存放任何值:
1 | Object[] o =new Object[12]; |
而对于集合来说呢?显然一个List肯定是不允许同时存放int和String,所以对于集合来讲得话,它就不是协变得。
这是因为集合在运行得时候有一个类型擦除,也就是说List<String>最后在编译器看来就是一个List,也就是它的原生类型。所以对于集合来讲得话就是一个逆变得。
泛型得用处
泛型有什么用呢?或者说泛型得优缺点在哪里呢?
泛型由于在编译期并不知道他会是什么类,所以泛型在构造得时候是一个非常麻烦的事情,类似于如下:
1 | T t1 =new T(); |
这行代码明显是错误得,为什么呢?因为T在编译期间并不知道这个是什么类,既然都不知道这个是什么类,那么又怎会知道调用哪一个构造函数呢?