话说泛型应该是C++里面先出来的玩意。但是JAVA 5开始也有了。那么什么叫泛型呢?
我的理解:泛型就是将类型参数化。也就是我们传参数时不再限于传一个特定类型的值了。举例说明:一下代码我们经常看到吧?
List<T> list=new ArrayList<T>():
其中T就决定了类型,但是Java里面T不允许是基础类型(int、long、double等,如果需要使用这些基础类型,可以用他们对应的包装类);
对于这个的使用我们都不陌生,只要是学过Java的基本都应该用过。但是很多人都会忽略一个比较基础的问题,我们怎么定义一个自己的泛型类呢?
例:
public class Generic<V>{
T t;
Generic(T t){
this.t=t;
}
}
这个也比较简单,但是我们经常会通过各种途径知道这样那样的警告:
1、不能有类似于T t=new T(),这样的实例化T的语句
2、T不能是静态变量
3、不适当的重载会出现问题
这个是神马原因呢??
其实当我们尝试去了解Java泛型实现的机制就一目了然了。很过官方、非官方正式文档都说Java的泛型使用的是叫擦拭的原理:当Java代码被编译时,全部泛型类型的信息都会被擦拭。实际上的意思就是说:构造延迟。
因为可以擦除功能,所以 List<Integer>
和 List<Long>
是同一个类,编译器在编译 List<T>
时只生成一个类。因此,在编译 List<T>
类时,编译器不知道 T所表示的类型,所以它就不能像知道类所表示的具体类型那样处理 List<T>
类定义中的类型参数(List<T>
中的T
)。
因为运行时不能区分 List<String>
和 List<Integer>
(运行时都是 List
),所以上面几个警告当然就很明显是应当注意的。