首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【Java 泛型】泛型用法 ( 泛型编译期擦除 | 上界通配符 <? extends T> | 下界通配符 <? super T> )

在运行时 , 已经没有泛型相关的限制 , 泛型限制在编译时就已经被擦除了 ; 但是 泛型的信息 , 保存在了常量表中 , 仍然可以获取到 ; 泛型擦除 是为了 泛型可以兼容 老版本的 JDK 而设计的..., 泛型是 JDK 5 加入的 , 如果添加了泛型 , 导致字节码的格式改变 , 必然导致之前版本的 JDK 无法运行有泛型的字节码程序 ; 给定一个 Demo.java 类 , 其中定义了一个 data5 = new Data(); // 不符合要求 , Animal 是最顶层的类 , 其取值都不符合 要求...super Person> data5 = new Data(); // 不符合要求 , Animal 是最顶层的类 , 其取值都不符合 要求...super Animal> data6 = new Data(); 报错信息 : 不符合要求 , Animal 是最顶层的类 , 其取值都不符合 要求

95010
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    java虚拟机知识点简要梳理

    如果父类加载器没有找到这个类,则再往上的父类查找,一直到顶层的启动类加载器,如果还是找不到,则启动类加载器尝试加载这个类,如果没有加载成功,则返回空给子加载器,子加载器如果也没有加载到,则继续往下的类加载器走...(2).每一层的类加载器都把类加载请求委派给父类加载器,直到所有的类加载请求都应该传递给顶层的启动类加载器。...(3).如果顶层的启动类加载器无法完成加载请求,子类加载器尝试去加载,如果连最初发起类加载请求的类加载器也无法完成加载请求时,将会抛出ClassNotFoundException,而不再调用其子类加载器去进行类加载...双亲委派模式的类加载机制的优点是java类它的类加载器一起具备了一种带优先级的层次关系,越是基础的类,越是被上层的类加载器进行加载,保证了java程序的稳定运行。...七、卸载 虽然说有人把方法区称作为永久区,但实际上还是有可能被回收掉的,当某个类确定不再被使用时,可以从方法区中卸载 参考文档: 1.

    59630

    友好的 Python:面向对象接口

    用上了 dataclass,并提供了适当的默认值,小 F 还是很熟练嘛。 小 F:算作者识相,没有故意安排我做反面教材。 这个类要怎么使用呢?...settinigs = Settings(db_user='root', db_password=os.getenv("DB_PASSWORD")) 多种初始化方式 但一个配置类,哪能总是从参数去指定呢...但这种方法有一点小小的问题,要 import 的东西有点多,这里顶层就暴露了三个类和函数。小 F 的同事小 C 说,那这样可不可以: class Settings: ......我们千万要警惕这种「炫技」的倾向,如果有多种实现方案,一定要选择最直截了当简单明白的方法。另一个原则是,你提供的东西,最好只提供刚好所需要的接口,而不暴露多余的接口。...减少重复(DRY) 本来打算结束,篇幅不够,那再加一个需求:让配置支持默认从环境变量中取值,并且更新环境变量能立刻生效。

    23170

    Java的常见误区与细节

    如果变量是byte,short,byte类型,当对其赋予编译时期的常量,而该常量又没有超过变量的取值范围时,编译器就可以进行隐式的收缩转换。...换句话说,如果子类重写了父类的方法,当父类的引用指向子类对象时,通过父类的引用调用的是子类方法。如果子类隐藏了父类的方法(成员变量),通过父类的引用调用的仍是父类的方法(成员变量)。...23 构造器是递归调用的,子类的构造器会调用父类的构造器,直到调用Object类的构造器为止。 24 构造器没有创建对象,构造器是使用new创建对象时由系统调用的,用来初始化类的实例成员。...从顺序上说,先是创建对象,然后再调用构造器的。(构造器并没有产生新的对象) 25 默认的构造器不为空,该构造器会调用父类的无参构造器,并可能执行实例成员变量的初始化。...=运算符的两个操作数的类型一个是基本数据类型,另一个是包装类引用类型时,将引用类型拆箱转换为基本数据类型,然后比较两个基本数据类型的值是否相等。

    70730

    Java 常见的 30 个误区与细节!

    如果变量是byte,short,byte类型,当对其赋予编译时期的常量,而该常量又没有超过变量的取值范围时,编译器就可以进行隐式的收缩转换。...换句话说,如果子类重写了父类的方法,当父类的引用指向子类对象时,通过父类的引用调用的是子类方法。如果子类隐藏了父类的方法(成员变量),通过父类的引用调用的仍是父类的方法(成员变量)。...23   构造器是递归调用的,子类的构造器会调用父类的构造器,直到调用Object类的构造器为止。 24   构造器没有创建对象,构造器是使用new创建对象时由系统调用的,用来初始化类的实例成员。...从顺序上说,先是创建对象,然后再调用构造器的。(构造器并没有产生新的对象) 25   默认的构造器不为空,该构造器会调用父类的无参构造器,并可能执行实例成员变量的初始化。...=运算符的两个操作数的类型一个是基本数据类型,另一个是包装类引用类型时,将引用类型拆箱转换为基本数据类型,然后比较两个基本数据类型的值是否相等。

    60230

    重构-改善既有代码的设计:坏代码的味道,编写代码20多宗罪(三)

    Feature Envy 依恋情节 类的方法应该去该去的地方: 即某个函数为了计算某值,从另一个对象那儿调用了大量的取值函数 函数对某个类的兴趣高过对自己所处的类,通常的焦点就是数据...,某个函数为了计算某个值,从另一个对象那儿调用几乎半打的取值函数。...如果子类复用了超类的行为,却有不愿支持超类的接口,Refused Bequest的坏味道就会变得浓烈。拒绝继承超类的实现, 这点我们不介意;但如果拒绝继承超类的接口,我们不以为然。...1个子类,必须也为另一个类相应增加1个子类。...或者可以尝试运用 Hide Delegate (隐藏委托关系)让另一个类来为它们传递相思情。

    64520

    重构·改善既有代码的设计.02之代码的“坏味道”

    最单纯的Duplicated Code就是“同一个类中含有相同的表达式”或“两个互为兄弟的子类内含有相同表达式”。...函数对某个类的兴趣程序高于对自己所处类的兴趣。如果某个函数为了计算某个值,需要从另一个对象中调用几乎一般的取值函数,那么就该迁移到它该去的地方。 Data Clumps 数据泥团。...单你为某个类增加一个子类,必须也为另一个类相应增加一个子类。如果你发现某个继承体系的类名称前缀和另一个继承体系的类名称前缀完全相同,那么便是这种坏味道。 Lazy Class 冗赘类。...继承体系中,子类应该继承超类的函数和数据。但如果子类复用了超累的行为(实现),却又不愿意支持超类的接口。就像他们得到所有礼物,却只从中挑选几样来玩。按传统的说法,这就意味着继承体系设计错误。...,然后针对任何功能的任何一种可能失败情况,进行测试 测试的要诀:测试你最担心出错的部分 编写未臻完善的测试并实际运行,好过对完美测试的无尽等待 作者提到,当测试数量达到一定程度之后,继续增加测试带来的效益会呈现递减态势

    14610

    Java培训实战教程之Java基础知识精华部分(四)(五)

    多重继承的出现,就有了继承体系。体系中的顶层父类是通过不断向上抽取而来的。它里面定义的该体系最基本最共性内容的功能。...所以,一个体系要想被使用,直接查阅该系统中的父类的功能即可知道该体系的基本用法。 那么想要使用一个体系时,需要建立对象。建议建立最子类对象,因为最子类不仅可以使用父类中的功能。...还可以使用子类特有的一些功能。 简单说:对于一个继承体系的使用,查阅顶层父类中的内容,创建最底层子类的对象。...当子父类中出现了一模一样的方法时,建立子类对象会运行子类中的方法。好像父类中的方法被覆盖掉一样。所以这种情况,是函数的另一个特性:覆盖(复写、重写) 什么时候使用覆盖呢?...注意: 子类中所有的构造函数都会默认访问父类中的空参数的构造函数,因为每一个子类构造内第一行都有默认的语句super(); 如果父类中没有空参数的构造函数,那么子类的构造函数内

    43530

    详细讲解并发编程中不得不学的AQS

    1.1 state共享变量 AQS中里一个很重要的字段state,表示同步状态,是由volatile修饰的,用于展示当前临界资源的获锁情况。...1.2 CLH队列 AQS里另一个重要的概念就是CLH队列,它是一个双向链表队列,其内部由head和tail分别记录头结点和尾结点,队列的元素类型是Node。...这个方法是尝试获取资源,但是获取资源的方式有很多种实现,比如公平锁有公平锁的获取方式,非公平锁有非公平锁的获取方式(后面会讲,别急)。所以这里是一个没有具体实现的方法,需要由子类去实现。...下面我们从源码去分析其实现原理。 首先还是看最顶层的acquireShared()方法。...tryAcquireShared()方法是一个模板方法由子类去重写,意思是需要如何获取同步资源由实现类去定义,AQS只是一个框架。

    51310

    Java 常见的 30 个误区与细节!

    如果变量是byte,short,byte类型,当对其赋予编译时期的常量,而该常量又没有超过变量的取值范围时,编译器就可以进行隐式的收缩转换。...换句话说,如果子类重写了父类的方法,当父类的引用指向子类对象时,通过父类的引用调用的是子类方法。如果子类隐藏了父类的方法(成员变量),通过父类的引用调用的仍是父类的方法(成员变量)。...23 构造器是递归调用的,子类的构造器会调用父类的构造器,直到调用Object类的构造器为止。 24 构造器没有创建对象,构造器是使用new创建对象时由系统调用的,用来初始化类的实例成员。...从顺序上说,先是创建对象,然后再调用构造器的。(构造器并没有产生新的对象) 25 默认的构造器不为空,该构造器会调用父类的无参构造器,并可能执行实例成员变量的初始化。...=运算符的两个操作数的类型一个是基本数据类型,另一个是包装类引用类型时,将引用类型拆箱转换为基本数据类型,然后比较两个基本数据类型的值是否相等。

    63010

    【笔记】《重构: 改善既有代码的设计》

    我们应该将消息链尽量提取和拆分, 提炼一些小函数作为链条中间的接口, 当用户可以从链的任何节点开始运行时, 解耦就做得差不多了 3.16 中间人 避免太多的委托和中间人的设计, 如果发现某个类和另一个类的交流中有一半以上的接口都由中间人来负责的话...如果目标函数使用了源类中的特性,你得决定如何从目标函数引用源对象。如果目标类中没有相应的引用机制,就把源对象的引用当作参数,传给新建立的目标函数。...在目标类新建一个字段,修改源字段的所有用户,令它们改用新字段。为了稳定搬运, 都是先在目标类建立相同的字段和对应的设/取值函数, 然后慢慢对接直到最终从源类中删除字段...., 可以尝试用多态子类来处理, 用工厂函数包装和类型码有关的目标类, 然后返回不同的子类, 这样未来也方便进行扩展, 尽量保证与类型码相关的switch只出现在工厂函数中. 8.15 以状态/策略对象取代类型码...然后为这个类添加对应各个类型码的子类, 然后在我们的目标类中保存这个类型码类, 增加对应的set函数, set函数会从工厂函数生成所需的类型码对象.

    1.6K20

    Java并发-AbstractQueuedSynchronizer(AQS)JDK源代码分析

    如果 pred 的 waitStatus > 0,表明 pred 的线程状态 CANCELLED,需从队列中删除(查看1.6中对于节点等待状态的取值说明就能理解其中含义)。...2.4 独占模式AQS子类的具体代码案例  在上述对AQS类分析的过程中,提到了tryAcquire,即尝试获得线程锁的方法必须得由继承于AQS的子类实现,其为获得锁最关键的实现,所以我们有必要对其做一个举例...0 代表获取成功,但没有剩余资源,其它线程不能够继续获取 正数 代表获取成功,还有剩余资源,其他线程还可以去获取 不过如何去判断资源是否有剩余,需要由子类继承AQS类后对本方法进行重写,决定其逻辑...四、独占模式与共享模式中AQS方法调用逻辑总结 4.1 AQS独占模式方法分析  独占模式下获得锁的方法 方法名 作用/地位 acquire(int arg) 独占模式中的使线程获得锁的最顶层方法 tryAcquire.../地位 acquireShared(int) 此方法是共享模式下获取资源的最顶层方法 tryAcquireShared(int arg) 此方法是共享模式下获得锁资源的核心方法,其必须得由AQS子类方法重写

    90120

    Java基础教程(12)-Java中的IO流

    一个输入流能够抽象多种不同类型的输入:从磁盘文件,从键盘或从网络套接字。同样,一个输出流可以输出到控制台,磁盘文件或相连的网络。Java 定义了两种类型的流:字节类和字符类。...取值 0 或者 1Byte(字节)是计算机操作数据的最小单位由 8 位 bit 组成 取值(-128-127)Char(字符)是用户的可读写的最小单位,在 Java 里面由 16 位 bit 组成 取值...字节流字节流由两个类层次结构定义。在顶层有两个抽象类InputStream 和 OutputStream。...每个抽象类都有多个具体的子类,这些子类对不同的外设进行处理,例如磁盘文件,网络连接,甚至是内存缓冲区。不用缓冲区,直接对文件本身操作。...顶层有两个抽象类:Reader和Writer。这些抽象类处理统一编码的字符流。抽象类Reader和Writer定义了几个实现其他流类的关键方法。

    11610

    1w5000字概括ES6全部特性

    只能通过类来调用(方法中的this指向类,而不是实例) 继承 父类静态属性方法可被子类继承 子类继承父类后,可从super上调用父类静态属性方法 作为函数调用:只能在构造函数中调用super(),内部this...() { super(); }定义继承父类,没有书写则显示定义 子类继承父类:子类使用父类的属性方法时,必须在构造函数中调用super(),否则得不到父类的this 实例:类相当于实例的原型,所有在类中定义的属性方法都会被实例继承...this.mothod = this.mothod.bind(this) 箭头函数:this.mothod = () => this.mothod() 属性定义位置 定义在构造函数中并使用this指向 定义在类最顶层...) 构造函数默认返回实例对象(this),可指定返回另一个对象 取值函数和存值函数设置在属性的Descriptor对象上 类不存在变量提升 利用new.target === Class写出不能独立使用必须继承后才能使用的类...子类继承父类后,this指向子类实例,通过super对某个属性赋值,赋值的属性会变成子类实例的属性 使用super时,必须显式指定是作为函数还是作为对象使用 extends不仅可继承类还可继承原生的构造函数

    1.7K20

    大白话说Java泛型:入门、使用、原理

    也就是说:泛型只存在于编译阶段,而不存在于运行阶段。在编译后的 class 文件中,是没有泛型这个概念的。...泛型中的向上转型 当我们明白了编译时类型和运行时类型之后,我们再来理解通配符的诞生就相对容易一些了。 还是上面的场景,我们有一个 Fruit 类,Apple 类是 Fruit 的子类。...这还得从我们对盘子的定义说起。 Plate但 JVM 能确定的是,任何 Apple 的子类都可以转为 Apple 类型,但任何 Apple 的父类都无法转为 Apple 类型。...JVM 在编译的时候知道,我们具体的运行时类型可以是任何 Apple 的父级,那么为了安全起见,我们就用一个最顶层的父级来指向取出的数据,这样就可以避免发生强制类型转换异常了。

    86960
    领券