java泛型的一些思考

为什么需要泛型

在Java中其实Object这个类已经可以解决大部分的泛型问题了,那么现在为什么还需要泛型了,一种说法是为了安全,因为在编译期使用泛型的话便可以基本确定这个参数的类型了,但是使用Object的话,由于Object是所有类型的超类,所以这会给代码造成一定的安全性问题。

1
2
3
4
5
6
7
public void testList(T t){
List<Object> list =new ArrayList<>();
List<T> list1 =new ArrayList<>();
list.add(1);
list.add("1");
list.add(t);
}

在上面的例子中,list1由于其类型是T,这就会导致在向list1中插入数据的时候只能是泛型T,但是对于list而言,由于Object是所有类的超类,那么这个list就可以插入任何值了,所以这就导致了一些安全问题

关于Java的协变和逆变:

在Java里面数组是协变的。对于数组来讲一个Object数组是可以存放任何值:

1
2
3
Object[] o =new Object[12];
o[0]=1;
o[1]="1";

而对于集合来说呢?显然一个List肯定是不允许同时存放intString,所以对于集合来讲得话,它就不是协变得。
这是因为集合在运行得时候有一个类型擦除,也就是说List<String>最后在编译器看来就是一个List,也就是它的原生类型。所以对于集合来讲得话就是一个逆变得。

泛型得用处

泛型有什么用呢?或者说泛型得优缺点在哪里呢?
泛型由于在编译期并不知道他会是什么类,所以泛型在构造得时候是一个非常麻烦的事情,类似于如下:

1
T t1 =new T();

这行代码明显是错误得,为什么呢?因为T在编译期间并不知道这个是什么类,既然都不知道这个是什么类,那么又怎会知道调用哪一个构造函数呢?

作者

Somersames

发布于

2018-04-04

更新于

2021-04-05

许可协议

评论