java泛型功能

Java 泛型 Class

泛型中? extends T和? super T 差别

? extends T和? super T含有JAVA5.0的新的概念。由于它们的外表导致了很多人误解了它们的用途:

1.?

extends T首先你很容易误解它为继承于T的所有类的集合,这是大错特错的,相信能看下去你一定见过或用过List?

extends T吧?为什么我说理解成一个集合是错呢?如果理解成一个集合那为什么不用ListT来表示?所以?

extends

T不是一个集合,而是T的某一种子类的意思,记住是一种,单一的一种,问题来了,由于连哪一种都不确定,带来了不确定性,所以是不可能通过

add()来加入元素。你或许还觉得为什么add(T)不行?因为? extends

T是T的某种子类,能放入子类的容器不一定放入超类,也就是没可能放入T。

2.? super T这里比较容易使用,没? extends T这么多限制,这里的意思是,以T类为下限的某种类,简单地说就是T类的超类。但为什么add(T)可以呢?因为能放入某一类的容器一定可以放入其子类,多态的概念。

擦除

许泛型最具挑战性的方面是擦除(erasure),这是 Java

语言中泛型实现的底层技术。擦除意味着编译器在生成类文件时基本上会抛开参数化类的大量类型信息。编译器用它的强制类型转换生成代码,就像程序员在泛型出

现之前手工所做的一样。区别在于,编译器开始已经验证了大量如果没有泛型就不会验证的类型安全约束。

通过擦除实现泛型的含意是很重要的,并

且初看也是混乱的。尽管不能将ListInteger 赋给ListNumber,因为它们是不同的类型,但是

ListInteger 和 ListNumber 类型的变量是相同的类!要明白这一点,请评价下面的代码:

new ListNumber().getClass() == new ListInteger().getClass()

编译器只为 List 生成一个类。当生成了 List 的字节码时,将很少剩下其类型参数的的跟踪。

生成泛型类的字节码时,编译器用类型参数的擦除替换类型参数。对于无限制类型参数(V),它的擦除是

Object。对于上限类型参数(K extends ComparableK),它的擦除是其上限(在本例中是

Comparable)的擦除。对于具有多个限制的类型参数,使用其最左限制的擦除。

如果检查生成的字节码,您无法说出 ListInteger 和 ListString 的代码之间的区别。类型限制 T 在字节码中被 T 的上限所取代,该上限一般是 Object。

多重限制

一个类型参数可以具有多个限制。当您想要约束一个类型参数比如说同时为 Comparable 和 Serializable 时,这将很有用。多重限制的语法是用“与”符号分隔限制:

class CT extends Comparable? super TSerializable

通配符类型可以具有单个限制 —— 上限或者下限。一个指定的类型参数可以具有一个或多个上限。具有多重限制的类型参数可以用于访问它的每个限制的方法和域。

类型形参和类型实参

参数化类的定义中,占位符名称(比如 CollectionV 中的 V)叫做类型形参(type

parameter),它们类似于方法定义中的形式参数。在参数化类的变量的声明中,声明中指定的类型值叫做类型实参(type

argument),它们类似于方法调用中的实际参数。但是实际中二者一般都通称为“类型参数”。所以给出定义:

interface CollectionV { … }

和声明:

CollectionString cs = new HashSetString();

那么,名称 V(它可用于整个 Collection 接口体内)叫做一个类型形参。在 cs 的声明中,String 的两次使用都是类型实参(一次用于 CollectionV,另一次用于 HashSetV)。

于何时可以使用类型形参,存在一些限制。大多数时候,可以在能够使用实际类型定义的任何地方使用类型形参。但是有例外情况。不能使用它们创建对象或数组,

并且不能将它们用于静态上下文中或者处理异常的上下文中。还不能将它们用作父类型(class FooT extends

T),不能用于 instanceof 表达式中,不能用作类常量。

类似地,关于可以使用哪些类型作为类型实参,也存在一些限制。类型实参

必须是引用类型(不是基本类型)、通配符、类型参数,或者其他参数化类型的实例化。所以您可以定义

ListString(引用类型)、List?(通配符)或者

ListList?(其他参数化类型的实例化)。在带有类型形参 T 的参数化类型的定义中,您也可以声明

ListT(类型形参)。

JAVA中的泛型用法一种: 返回值用法。

1、对于泛型方法来说,是可以接收不同类型的参数,比如下图,使用泛型来操作List集合,然后向List中添加一条数据,看是否可以添加成功,创建泛型方法如图所示。

2、然后在写一个main方法来测试一下这个泛型方法,先向集合中添加一条String类型的数据,打印List集合中的元素,如图所示。

3、上面是往List集合中添加了一个String类型的数据,下图往List集合中添加一条Integer类型的数据并打印,当然也可以自己创建对象进行添加。

4、泛型也是可以限制要使用的参数类型的,比如上面,list集合中,只想加入数字类型的数据,当然也是可以的,只要让类中的T继承Number就行了,如图所示。

5、下面在测试一下,向集合中添加一个Long类型的数据并打印,如图所示。

6、最后输出就完成了。

java泛型功能

本文来自投稿,不代表【】观点,发布者:【

本文地址: ,如若转载,请注明出处!

举报投诉邮箱:253000106@qq.com

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2024年3月21日 16:23:31
下一篇 2024年3月21日 16:30:44

相关推荐

  • 深入java虚拟机pdf,深入java虚拟机 中村成洋 pdf

    在linux环境下,java怎么实现从word格式转换为pdf格式 //设置当前使用的打印机,我的Adobe Distiller打印机名字为 Adobe PDF wordCom.setProperty( ActivePrinter , new Variant( Adobe PDF ));//设置printout的参数,将word文档打印为postscript…

    2024年5月23日
    4600
  • c语言改写模式,c语言实现修改功能

    c语言程序修改? 1、这个程序有4个错误,我都加粗了,第一个是m没有赋初值,第二个是while表达式中的ch=getchar()需要括号括起来,第三个是m=m*10+ch-0中的0也需要用单引号括起来,第四个是第2个while中为m!=0。 2、define容易造成误会,因为不符合一般的编程习惯,false 0, true 1;scanf放在你的那个地方是达…

    2024年5月23日
    4100
  • java截取指定长度字符串,java截取指定字符串之后的

    java中如何截取字符串中的指定一部分 第一个参数是开始截取的字符位置。(从0开始)第二个参数是结束字符的位置+1。(从0开始)indexof函数的作用是查找该字符串中的某个字的位置,并且返回。 int end);截取s中从begin开始至end结束时的字符串,并将其赋值给s;split讲解:java.lang.string.split split 方法 将…

    2024年5月23日
    4400
  • java绑定一个端口,java使用端口

    java如何多个service共用一个端口 你如果有多个项目的话,你可以把多个项目放到一个tomcat里面,这样端口相同使用项目名称来进行区分项目。你如果非要使用同一个,你也可以配置不同的域名导向不同的项目。就是访问的域名不同转接到的项目不同。 如果需要同时启动多个程序,要么修改tomcat的配置文件中的监听端口。要么修改jar包程序的监听端口。不能在一台服…

    2024年5月23日
    3600
  • java多线程并发编程基础,Java多线程并发执行返回

    电脑培训分享Java并发编程:核心理论 电脑培训发现本系列会从线程间协调的方式(wait、notify、notifyAll)、Synchronized及Volatile的本质入手,详细解释JDK为我们提供的每种并发工具和底层实现机制。 人们开始意识到了继承的众多缺点,开始努力用聚合代替继承。软件工程解决扩展性的重要原则就是抽象描述,直接使用的工具就是接口。接…

    2024年5月23日
    4800
  • 自学java找工作,自学java找工作需要包装简历吗

    自学java学多久可以找到工作 1、自学Java至少需要一年以上的时间才能达到找工作的水平。报班培训四到六个月的时间就可以找到一份不错的工作。 2、自学Java至少需要一年以上的时间才能达到找工作的水平。 3、如果要想找到一份Java相关的工作,需要至少学习5-6个月时间才能就业。Java开发需要掌握一些基础的编程语言知识,比如掌握面向对象的编程思想、基本的…

    2024年5月23日
    4400
  • java左移右移,java 左移

    java位移问题 1、思路:直接用Integer类的bit运算操作。 2、移位操作:左移:向左移位,符号后面的数字是移了多少位,移的位用0补齐,例如2进制数01111111左移一位后变为11111110,移位是字节操作。 3、Java 位运算 Java 位运算[转]一,Java 位运算表示方法: 在Java语言中,二进制数使用补码表示,最高位为符号位,正数的…

    2024年5月23日
    4300
  • java技术规范,java规范性要求

    现在主流的JAVA技术是什么? java最流行开发技术程序员必看 1 、Git Git一直是世界上最受欢迎的Java工具之一,也是Java开发人员最杰出的工具之一。Git是一个开源工具,是-种出色的分布式版本控制解决方案。 (1).Java基础语法、数组、类与对象、继承与多态、异常、范型、集合、流与文件、反射、枚举、自动装箱和注解。(2).Java面向对象编…

    2024年5月23日
    4100
  • javasocket编程,Java socket编程中,禁用nagle算法的参数

    Java进行并发多连接socket编程 1、Java可利用ServerSocket类对外部客户端提供多个socket接口。基本的做法是先创建一个ServerSocket实例,并绑定一个指定的端口,然后在这个实例上调用accept()方法等待客户端的连接请求。 2、Socket socket=server.accept(0;Thread handleThrea…

    2024年5月23日
    4700
  • java死亡,java死代码是什么意思

    我的世界传送回死亡点指令是什么? 1、下面就让我们一起来了解一下吧:我的世界回到死的地方的指令是输入/back,就可以回到死亡地点了,当然也可以看信标,因为死亡后会有一道光集中在死亡点,只要循着光就可以找到目的地了。 2、在服务器中的指令 首先打开指令台,在指令行输入“/back”就可以回到自己的死亡地点了。在单人游戏中的指令 在单人游戏中,您无法直接返回到…

    2024年5月23日
    4900

发表回复

登录后才能评论



关注微信