可选中1个或多个下面的关键词,搜索相关资料。也可直接点“搜索资料”搜索整个问题。
可选中1个或多个下面的关键词,搜索相关资料。也可直接点“搜索资料”搜索整个问题。
Java中的泛型这一概念提出的目的,导致其只是作用于代码编译阶段,在编译过程中,对于正确检验泛型结果后,会将泛型的相关信息擦出,也就是说,成功编译过后的class文件中是不包含任何泛型信息的。泛型信息不会进入到运行时阶段。额 所以不用找泛型的实现代码...有泛型的使用代码,没有泛型本身的代码
可以去类似于github等开源平台,都我可以找到想要的源码。
java泛型是对语言的类型的一种扩展,泛型的本质就是将所操作的数据类型参数化。下面我会由浅入深地介绍Java的泛型。
在java代码里,你会经常发现类似下边的代码:
编码的时候,不加泛型是可以的,但是 你从容器中拿出来的时候必须强制类型转换,第一是多敲很多代码,第二极容易发生类型转换错误,这个运行时异常 比如你把上边
注释的代码放开,程序在获取容器的地方就会报运行时异常 ClassCasrException
Java语言的设计者引入了泛型,暂时先不追究它内在是怎么实现的。只需要知道,如果我们像下边这么写,我们就不需要强制类型转换。我们也不需要担心运行是异常了。
从面向对象的角度看,使用对象的时候,泛型内传入的具体的类型。声明的时候采用尖括号内加占位符的形式,比如这是HashMap的源码
在上边的代码中,我们可以看到在类上如何定义泛型,也看到了类上定义的占位符在类的普通方法上可以直接使用。但是如果想在静态方法上定义泛型,这需要单独的处理 。下面我们单独对方法上如何定义
和使用泛型进行介绍(注意:方法上是否定义泛型和类上是否定义没有必然的联系)
比如Web项目中,泛型是修饰类型的,在方法上,一般就是返回值和参数列表
方法定义的时候,泛型是这样设计,在使用的时候,代码如下:
上边的HashMap代码中,也看到了在类上使用泛型的具体例子。在真正的项目上,一些基础的公共类经常定义泛型,如下:
接口的实现类: 传入参数为T,实现类中也可以继续用T,返回为T也可以用T;实现的时候 可以用 extends限定泛型的边界。
Java中泛型在运行期是不可见的,会被擦除为它的上级类型。如果你是无界的泛型参数类型,就会被替换为Object.
参考于( )泛型类型的子类型的不相关性。比如
假设给定的泛型类型为G,(如List<E>中的List),两个具体的泛型参数X、Y,当中Y是X的子类(如上的Animal和Cat))
泛型可以用到容器,方法,接口,内部类,抽象类
泛型是Java1.5之后才引入的,为了兼容。Java采用了C++完全不同的实现思想。Java中的泛型更多的看起来像是编译期用的,比如我定义一个使用泛型的demo
我在查看它的class文件时,发现class文件并没有任何泛型信息。
在JAVA的虚拟机中并不存在泛型,泛型只是为了完善java体系,增加程序员编程的便捷性以及安全性而创建的一种机制,在JAVA虚拟机中对应泛型的都是确定的类型,在编写泛型代码后,java虚拟中会把这些泛型参数类型都擦除,用相应的确定类型来代替,代替的这一动作叫做类型擦除,而用于替代的类型称为原始类型,在类型擦除过程中,一般使用第一个限定的类型来替换,若无限定,则使用Object.
关键在于从泛型类型中清除类型参数的相关信息,并且再必要的时候添加类型检查和类型转换的方法。
可以参考。 运行期编译期会去掉泛型信息,转换为左边界,在调用的地方添加类型转换。
泛型类的静态变量是共享
java中的泛型不只是上述说的内容,还有一些特殊的地方,如果这些地方也用泛型该怎么设计。比如说“动态类型”,“潜在类型”,“异常”
就在调用的地方传入类型信息
不能抛出也不能捕获泛型类的对象。事实上,泛型类扩展Throwable都不合法,因为泛型信息会被擦除,相当于catch两个相同的异常,是不可以的
不能声明参数化类型的数组, 数组可以记住自己的元素类型,不能建立一个泛型数组。(当然 你如果用反射还是可以创建的,用Array.newInstance。这里说不能建是不能用普通方法)
1.基本类型无法作为类型参数即ArrayList<int>这样的代码是不允许的,如果为我们想要使用必须使用基本类型对应的包装器类型ArrayList<Integer>
2.在泛型代码内部,无法获得任何有关泛型参数类型的信息换句话说,如果传入的类型参数为T,即你在泛型代码内部你不知道T有什么方法,属性,关于T的一切信息都丢失了(类型信息,博文后续)。
3.注,在能够使用泛型方法的时候,尽量避免使整个类泛化。
虚拟机中没有泛型,只有普通类和普通方法
所有泛型类的类型参数在编译时都会被擦除
创建泛型对象时请指明类型,让编译器尽早的做参数检查
要忽略编译器的警告信息,那意味着潜在的ClassCastException等着你。