Java泛型相关问题

来源:互联网 发布:网络剧和电视剧的区别 编辑:程序博客网 时间:2024/05/18 03:13


话说泛型应该是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),所以上面几个警告当然就很明显是应当注意的。

原创粉丝点击