java泛型的实现原理

     2022-03-20     365

关键词:

  1.基本学过JAVA的人都知道一点泛型,明白常出现的位置和大概怎么使用。

   在类上为:class 类名<T> {}  在方法上为:public <T> void 方法名 (T x){}

   就不再赘述了。

  2.泛型就是将类型变成了参数去传入,使得可以使用的类型多样化,进而实现解耦。

   JAVA因为泛型是在1.5以后出现的,为了保持对以前版本的兼容,使用了擦除的方法实现泛型。所以比起C++等在使用上限制较多。

   擦除是什么呢,实际上就是一定程度无视了类型参数T,直接从T所在的类开始向上T的父类去擦除(或者说转型?)比如:我调用

   泛型方法,传了类型参数T进入方法内部,如果没在声明时做类似public T 方法名(T extends 某个父类 x){}这样的声明,在我的参

   数T和x传进去后,JAVA就进行了向上类型的擦除,直接把参数x当做Object类来处理,而不是我传进去的T。如果我声明了向上的界

   限T extends Father,那就会把参数x擦除到Father类,当做Father类来使用。

   也就是说,在有泛型的任何类或方法的内部,它都无法知道自己的泛型参数,就像泛型参数没有传入类或方法里面一样。

   那为何泛型参数会在类和方法上起作用?

   根据《Thinking in JAVA》里描述,擦除和转型都是在边界上发生的,也就是说我们传进去的参数在进入类或方法的时候被擦除掉了,

   但是在传出来的时候又被转型成了我们设置的T。

   根据这一情况我们可知道,在泛型类或方法内,任何涉及到具体类型(即擦除后的类型的子类)的操作都不能进行比如:

   new T();或者T.play()(play为某子类的方法而不是擦除后的类的方法),又或者同时有T.method(T x),Tmethod(K x)

  3.在泛型里如下的例子无法成立

   List<Number> list = new List<Integer>();

   因为在编译器看来List<Number>不是List<Integer>的父类(我也不知道具体原因,谁知道告诉我下),虽然在我们看来Number是

   Integer的父类,那么他们组成的容器List应该有这种继承关系。

   为了实现这种继承关系,我们可以使用通配符?。这样写就可以了List<? extends Number>,这个是声明了这个List的内部成员继承自

   Number,确定了List的上界。那么我们就能执行List<? extends Number> list = new List<Integer>();了。

   但是要注意,原本我们泛型是参数类型T,规定了类型(你输入的啥类型就规定的啥),所以我们在执行list.add()的时候只能输入

   类型T的数据。在使用统配符后我们扩大了可选类型的范围,所以我们的操作也受到了限定,比如:list.add(),因为我们可以选的实

   例化List太多了,只要是Number的子类就行,JAVA可不知道我们会实例化什么List,为了确保安全就统统不能add了。但是我们可以

   list.get(),JAVA会把我们get的全都变成Number类型输出(里氏替换原则)。

   有了上界就能有下界,List<? super Integer>,和上界相反。因为我们不知道我们会是哪个Integer的父类,我们无法get到任何东西,

   但是我们可以add进去,只要add的是Integer和它的子类就行(还是里氏原则)。

   而且我们能使用List<? extends T>这种做法来进一步增加我们的选择。

 4.还有无界通配符<?>,根据以上推论就知道其作用和限制了,它与不加泛型的List相比在于强调它是规定了某类的List,而不是Object  

  类的List,只是我也不确定是什么类。

 

 

   


java泛型的内部原理设计泛型的好处

分享一些工作的经验:不存在脱离业务的技术。所有新技术都是为了解决一些业务痛点,让特定业务更爽。当我们掌握足够多的技术,在遇到问题时就可以选择适合的技术进行解决。反之,如果没有技术储备,就会手足无措,又... 查看详情

java编程:浅析泛型类型中的桥接方法

...、什么是桥接方法在介绍桥接方法之前,我先介绍下泛型。在JDK1.5中引入了泛型,泛型类型是基于原始类型、类型擦除原理进行实现的。原始类型Java总是会自动的为泛型类型提供一个相应的原始类型。所谓原始类型就是... 查看详情

java泛型的实际运用使用数组实现栈

 1、泛型的实际应用——实现最小值函数自己设计一个泛型的获取数组最小值的函数,并且数组的元素类型要是Number的子类并且实现了Comparable接口。public<TextendsNumber&Comparable<?superT>>Tmin(T[]arr){//因为Number并没... 查看详情

java泛型java使用泛型的意义

Java泛型Java使用泛型的意义@authorixenos  直接意义在编译时保证类型安全 根本意义a)类型安全问题源自可复用性代码的设计,泛型保证了类型安全的复用模板b)使用复用性模板时不用手动强制类型转换 三种泛型实现... 查看详情

java编程:浅析泛型类型中的桥接方法(代码片段)

...、什么是桥接方法在介绍桥接方法之前,我先介绍下泛型。在JDK1.5中引入了泛型,泛型类型是基于原始类型、类型擦除原理进行实现的。原始类型Java总是会自动的为泛型类型提供一个相应的原始类型。所谓原始类型就是... 查看详情

java泛型的基本介绍和使用

现在开始深入学习java的泛型了,以前一直只是在集合中简单的使用泛型,根本就不明白泛型的原理和作用。泛型在java中,是一个十分重要的特性,所以要好好的研究下。一、泛型的基本概念 泛型的定义:泛型是JDK1.5的一项... 查看详情

另一个泛型的 Java 泛型

】另一个泛型的Java泛型【英文标题】:JavaGenericofAnothergeneric【发布时间】:2014-01-0717:58:21【问题描述】:我有接口:interfaceIdentifable<TextendsSerializable>TgetID();和实现这个的类:publicclassCatimplementsIdentifable<Long>publicLonggetID().... 查看详情

java示例代码_使用泛型的Selenium Webdriver和类型构造函数-如何实现

java示例代码_使用泛型的Selenium Webdriver和类型构造函数-如何实现 查看详情

java中泛型的使用

泛型是JavaSE1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。Java语言引入泛型的好处... 查看详情

Java 泛型的类型别名

】Java泛型的类型别名【英文标题】:TypealiasesforJavagenerics【发布时间】:2009-03-2521:25:13【问题描述】:我有一组相当复杂的Java泛型类。比如我有一个界面interfaceDoable<X,Y>XdoIt(Yy);和实现classDoableImplimplementsDoable<Foo<Bar<Baz,... 查看详情

初识java集合及包装类和泛型的基本使用(代码片段)

....Collection接口说明2.Collection示例3.Map接口说明4.Map实例三、泛型1.泛型的分类2.泛型的定义3.泛型背后作用时期和背后的简单原理4.泛型的使用5.泛型总结四、包装类1.基本数据类型和包装类直接的对应关系2.包装类的使用,装箱(b 查看详情

什么是泛型?泛型的基本原理与使用优势。(代码片段)

目录 1.什么是泛型?2.先来看一个简单的泛型例子3.那么T是什么呢?4.如何使用泛型,并将类型作为参数传入呢?5.泛型的基本原理6.使用泛型的好处1.什么是泛型?泛型将接口的概念进一步延伸,“泛型”... 查看详情

java编程:浅析泛型类型中的桥接方法(代码片段)

...、什么是桥接方法在介绍桥接方法之前,我先介绍下泛型。在JDK1.5中引入了泛型,泛型类型是基于原始类型、类型擦除原理进行实现的。原始类型Java总是会自动的为泛型类型提供一个相应的原始类型。所谓原始类型就是... 查看详情

java编程:浅析泛型类型中的桥接方法(代码片段)

...、什么是桥接方法在介绍桥接方法之前,我先介绍下泛型。在JDK1.5中引入了泛型,泛型类型是基于原始类型、类型擦除原理进行实现的。原始类型Java总是会自动的为泛型类型提供一个相应的原始类型。所谓原始类型就是... 查看详情

剖根问底:java不能实现真正泛型的原因是什么?(代码片段)

...哥呀!今天我来给大家讲一下,Java不能实现真正泛型的原因是什么?本文已同步至GitHub《教妹学Java》专栏,风趣幽默,通俗易懂,对Java初学者亲切友善,么么哒😘,内容包括Java语法、Java集合... 查看详情

你是怎么理解java的泛型的?

解答:在JavaSE1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类... 查看详情

java泛型

泛型是JavaSE1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。Java语言引入泛型的好处是安全简单... 查看详情

java基础-泛型的优点

1、性能  对值类型使用非泛型集合类,在把值类型转换为引用类型,和把引用类型转换为值类型时,需要进行装箱和拆箱操作。装箱和拆箱的操作很容易实现,但是性能损失较大。假如使用泛型,就可以避免装箱和拆箱操作... 查看详情