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

Java入门(16)-- 枚举类型与泛型

doit()方法时,即使编译器不接受在接口中定义的常量参数,也不会报错;但调用doit2()方法,任意传递参数,编译器就会报错,因为这个方法只接受枚举类型的常量作为其参数。...("Constants_B")); } } 运行结果: 调用compareTo()方法返回的结果,正值代表方法中参数在调用该方法的枚举对象位置之前;0代表两个互相比较的枚举成员的位置相同;负值代表方法中参数在调用该方法的枚举对象位置之后...16.2.2 定义泛型类 Object类为最上层的父类,为了使程序更为通用,设计程序时通常使传入的值与返回的值都以Object类型为主,当需要使用这些实例时,必须正确地将该实例转换为原来的类型,否则在运行时将会发生...定义泛型类时声明多个类型 在定义泛型类时,可以声明多个类型,语法: MutiOverClass MutiOverClass : 泛型类名称 其中,T1和T2为可能被定义的类型。...继承泛型类与实现泛型接口 定义为泛型的类和接口也可以被继承与实现: public class ExtendClass {} Class SubClass extends

78230

拼夕夕三轮面经:被问到反射的bug,你中招了吗?

综上,反射调用方法,是以反射获取方法时传入的方法名和参数类型来确定调用的方法。 2 泛型的类型擦除 泛型允许SE使用类型参数替代精确类型,实例化时再指明具体类型。...案例 现在期望在类的字段内容变动时记录日志,于是SE想到定义一个泛型父类,并在父类中定义一个统一的日志记录方法,子类可继承该方法。上线后总有日志重复记录。...getMethods找到了两个setValue: 子类重写父类方法失败原因 子类未指定String泛型参数,父类的泛型方法setValue(T value)泛型擦除后是setValue(Object.../lang/String;)V 8: return } 若编译器未帮我们实现该桥接方法,则Sub2重写的是父类泛型类型擦除后、入参是Object的setValue。...入参为Object的桥接方法上标记了public synthetic bridge: synthetic代表由编译器生成的不可见代码 bridge代表这是泛型类型擦除后生成的桥接代码 修正 知道了桥接方法的存在

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

    反射和泛型的这些坑,你踏空了吗?

    且无论传包装类型/基本类型,最终都会调用Integer为入参的grade方法。 所以反射调用方法,是以反射获取方法时传入的方法名和参数类型来确定调用的方法。...2 泛型经过类型擦除多出桥接方法的坑 泛型是一种编程范式,允许开发者使用类型参数替代精确类型,实例化时再指明具体类型。也利于代码重用,将一套代码应用到多种数据类型。...案例 期望在类字段内容变动时记录日志,于是开发同学就想到定义一个泛型父类,并在父类中定义一个统一的日志记录方法,子类可继承该方法。上线后总出现日志重复记录问题。 父类 ?...子类Child1 未提供父类泛型参数且定义了一个参数为String而非T的setValue。期望覆盖父类的setValue实现。 ? 子类方法的调用是通过反射。 ?.../lang/String;)V 8: return } 若编译器未帮我们实现该桥接方法,那Child2重写的是父类泛型类型擦除后、入参是Object的setValue。

    58120

    Java5新特性及使用

    泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法中,分别称为泛型类、泛型接口、泛型方法。 2....要定义泛型方法,只需将泛型参数列表置于返回值之前,就像下面这样: public class GenericMethods { //当方法操作的引用数据类型不确定的时候,可以将泛型定义在方法上...自动装箱时编译器调用valueOf将原始类型值转换成对象,同时自动拆箱时,编译器通过调用类似intValue(), doubleValue()这类的方法将对象转换成原始类型值。...即在方法中定义可变参数后,我们可以像操作数组一样操作该参数; 3. 可变参数的使用规范 避免带有可变参数的方法重载,容易让人陷入调用的陷阱及误区。 别让null值和空值威胁到可变参数的方法。...反序列化行为也不相同 - 类信息用于查找适当的枚举类,并且Enum.valueOf方法与该类和所接收的常量名称一起被调用,以便获取返回的枚举常量。

    1.3K30

    拼夕夕三轮面经:被问到反射的bug,你中招了吗?

    综上,反射调用方法,是以反射获取方法时传入的方法名和参数类型来确定调用的方法。 2 泛型的类型擦除 泛型允许SE使用类型参数替代精确类型,实例化时再指明具体类型。...案例 现在期望在类的字段内容变动时记录日志,于是SE想到定义一个泛型父类,并在父类中定义一个统一的日志记录方法,子类可继承该方法。上线后总有日志重复记录。...子类未指定String泛型参数,父类的泛型方法setValue(T value)泛型擦除后是setValue(Object value),于是子类入参String的setValue被当作新方法 子类的.../lang/String;)V 8: return } 若编译器未帮我们实现该桥接方法,则Sub2重写的是父类泛型类型擦除后、入参是Object的setValue。...入参为Object的桥接方法上标记了public synthetic bridge: synthetic代表由编译器生成的不可见代码 bridge代表这是泛型类型擦除后生成的桥接代码 [watermark

    67600

    3分钟快速搞懂Java的桥接方法

    什么时候生成桥接方法? 为了实现哪些Java语言特性会生成桥接方法?最常见的两种情况就是协变返回值类型和类型擦除,因为它们导致了父类方法的参数和实际调用的方法参数类型不一致。...**因为在JVM方法中,返回类型也是方法签名的一部分,而桥接方法的签名和其父类的方法签名一致,以此就实现了协变返回值类型。...当一个子类在继承(或实现)一个父类(或接口)的泛型方法时,在子类中明确指定了泛型类型,那么在编译时编译器会自动生成桥接方法,例如: public class Parent { void...如何获取桥接方法的实际方法 在Spring Framework中已经实现了获取桥接方法的实际方法的功能,就在spring-core模块中的BridgeMethodResolver类中,像这样直接使用就行了...candidateMethods.get(0) : null); } 总结以上源码就是,通过判断方法名、参数的个数以及泛型类型参数来获取桥接方法的实际方法。

    78441

    Java基础教程(14)-Java中的枚举类,泛型和注解

    ,也可以嵌在其它 Java 类中;5) 枚举可以实现一个或多个接口(Interface); 6) 可以定义新的变量 ;7) 可以定义新的方法; 8) 可以定义根据具体枚举值而相异的类enum 就和 class...;使用泛型时,把泛型参数 替换为需要的class类型不指定泛型参数类型时,编译器会给出警告,且只能将 视为 Object 类型可以在接口中定义泛型类型,实现此接口的类必须实现正确的泛型类型编写泛型时...1、虚拟机中没有泛型,只有普通类和普通方法,所有泛型类的类型参数在编译时都会被擦除,泛型类并没有自己独有的 Class 类对象。...extends T> 允许调用读方法 T get() 获取 T 的引用,但不允许调用写方法 set(T) 传入 T 的引用(传入 null 除外)表示类型的下界,格式为: 允许调用写方法 set(T) 传入 T 的引用,但不允许调用读方法 Tget() 获取 T 的引用(获取 Object 除外)。

    27210

    3分钟快速搞懂Java的桥接方法

    什么时候生成桥接方法? 为了实现哪些Java语言特性会生成桥接方法?最常见的两种情况就是协变返回值类型和类型擦除,因为它们导致了父类方法的参数和实际调用的方法参数类型不一致。...因为在JVM方法中,返回类型也是方法签名的一部分,而桥接方法的签名和其父类的方法签名一致,以此就实现了协变返回值类型。...当一个子类在继承(或实现)一个父类(或接口)的泛型方法时,在子类中明确指定了泛型类型,那么在编译时编译器会自动生成桥接方法,例如: public class Parent { void...Parent的泛型方法时,明确指定了泛型类型为String,将这段代码进行编译,再反编译: public class Child extends Parent ......candidateMethods.get() : null); } 总结以上源码就是,通过判断方法名、参数的个数以及泛型类型参数来获取桥接方法的实际方法。

    32050

    Java—面向对象高级(第十二天)

    我们用代码演示一下,定义一个枚举类A,在枚举类中定义三个枚举项X, Y, Zpublic enum A{ X,Y,Z;}想要获取枚举类中的枚举项,只需要用类名调用就可以了public class...:枚举一般表示几个固定的值,然后作为参数进行传输。...三、泛型3.1 认识泛型所谓泛型指的是,在定义类、接口、方法时,同时声明了一个或者多个类型变量(如:),称为泛型类、泛型接口、泛型方法、它们统称为泛型。...下面就是泛型方法的格式public 泛型变量,泛型变量> 返回值类型 方法名(形参列表){ }下图中在返回值类型和修饰符之间有定义的才是泛型方法。...);//获取元素时,会将Integer类型自动拆箱为int类型int e = list.get(0);4.2.2 包装类数据类型转换在开发中,经常使用包装类对字符串和基本类型数据进行相互转换。

    7910

    Java 中文官方教程 2022 版(四十三)

    ClassDeclarationSpy示例展示了如何获取类的声明组件,包括修饰符、泛型类型参数、实现的接口和继承路径。...获取字段类型 描述了如何获取字段的声明类型和泛型类型 检索和解析字段修饰符 展示了如何获取字段声明的部分,如public或transient 获取和设置字段值 说明了如何访问字段的值...获取方法类型信息 展示了如何枚举类中声明的方法并获取类型信息 获取方法参数的名称 展示了如何检索方法或构造函数的参数的名称和其他信息 检索和解析方法修饰符描述了如何访问和解码与方法相关的修饰符和其他信息...这些任务在以下章节中介绍: 获取字段类型描述了如何获取字段的声明类型和泛型类型 检索和解析字段修饰符展示了如何获取字段声明的部分,比如public或transient 获取和设置字段值说明了如何访问字段值...以下部分涵盖了这些主题: 获取方法类型信息展示了如何枚举在类中声明的方法并获取类型信息 获取方法参数的名称展示了如何检索方法或构造函数的参数的名称和其他信息 检索和解析方法修饰符描述了如何访问和解码与方法相关的修饰符和其他信息

    19200

    夯实Java基础系列12:深入理解Java中的反射机制

    像Java在1.5中引入的很多特性,为了向后兼容,编译器会帮我们写的源代码做很多事情,比如泛型为什么会擦除类型,为什么会生成桥接方法,foreach迭代,自动装箱/拆箱等,这有个术语叫“语法糖”,而编译器的特殊处理叫...、com/mikan/Day$4.class,也就是说这四个命名字段分别使用了内部类来实现的;同时添加了两个方法values()和valueOf(String);我们定义的构造方法本来只有一个参数,但却变成了三个参数...n 个,因为声明的每一个枚举值都会调用构造函数去创建实例,所以参数一定是一一对应的;既然明白了这一点,那么我们只需要在枚举类中把这 n 个参数定义为 n 个成员变量,然后提供对应的 get() 方法,...如果想让枚举类更加的好用,就可以模仿我在实战三中的写法那样,通过某一个参数值,比如 key 参数值,就能获取到其对应的枚举值,然后想要什么值,就 get 什么值就好了。...() 获取枚举的位置(下标,初始值为 0 ) valueof(String msg) 通过 msg 获取其对应的枚举类型。

    1.6K00

    夯实Java基础系列14:深入理解Java枚举类

    像Java在1.5中引入的很多特性,为了向后兼容,编译器会帮我们写的源代码做很多事情,比如泛型为什么会擦除类型,为什么会生成桥接方法,foreach迭代,自动装箱/拆箱等,这有个术语叫“语法糖”,而编译器的特殊处理叫....class、com/mikan/Day$4.class,也就是说这四个命名字段分别使用了内部类来实现的;同时添加了两个方法values()和valueOf(String);我们定义的构造方法本来只有一个参数...n 个,因为声明的每一个枚举值都会调用构造函数去创建实例,所以参数一定是一一对应的;既然明白了这一点,那么我们只需要在枚举类中把这 n 个参数定义为 n 个成员变量,然后提供对应的 get() 方法,...如果想让枚举类更加的好用,就可以模仿我在实战三中的写法那样,通过某一个参数值,比如 key 参数值,就能获取到其对应的枚举值,然后想要什么值,就 get 什么值就好了。...() 获取枚举的位置(下标,初始值为 0 ) valueof(String msg) 通过 msg 获取其对应的枚举类型。

    38000

    Java中的语法糖

    在 JDK1.5 中,引入了泛型机制,但是泛型机制的本身是通过 类型擦除 来实现的,在 JVM 中没有泛型,只有普通类型和普通方法,泛型类的类型参数,在编译时都会被擦除。...那么自动拆箱和自动装箱是如何实现的呢? 其实这背后的原理是编译器做了优化。将基本类型赋值给包装类其实是调用了包装类的 valueOf() 方法创建了一个包装类再赋值给了基本类型。...int i1 = Integer.valueOf(1); 而包装类赋值给基本类型就是调用了包装类的 xxxValue () 方法拿到基本数据类型后再进行赋值。...除此之外,编译器还会为我们生成两个方法, values() 方法和 valueOf 方法,这两个方法都是编译器为我们添加的方法,通过使用 values () 方法可以获取所有的 Enum 属性值,...而通过 valueOf 方法用于获取单个的属性值。

    18620

    Java 中的语法糖有哪些呢

    在 JDK1.5 中,引入了泛型机制,但是泛型机制的本身是通过类型擦除 来实现的,在 JVM 中没有泛型,只有普通类型和普通方法,泛型类的类型参数,在编译时都会被擦除。...那么自动拆箱和自动装箱是如何实现的呢? 其实这背后的原理是编译器做了优化。将基本类型赋值给包装类其实是调用了包装类的 valueOf() 方法创建了一个包装类再赋值给了基本类型。...int i1 = Integer.valueOf(1); 而包装类赋值给基本类型就是调用了包装类的 xxxValue() 方法拿到基本数据类型后再进行赋值。...除此之外,编译器还会为我们生成两个方法,values() 方法和 valueOf 方法,这两个方法都是编译器为我们添加的方法,通过使用 values() 方法可以获取所有的 Enum 属性值,而通过 valueOf...方法用于获取单个的属性值。

    1.3K75

    夯实Java基础系列14:深入理解Java枚举类

    像Java在1.5中引入的很多特性,为了向后兼容,编译器会帮我们写的源代码做很多事情,比如泛型为什么会擦除类型,为什么会生成桥接方法,foreach迭代,自动装箱/拆箱等,这有个术语叫“语法糖”,而编译器的特殊处理叫....class、com/mikan/Day$4.class,也就是说这四个命名字段分别使用了内部类来实现的;同时添加了两个方法values()和valueOf(String);我们定义的构造方法本来只有一个参数...n 个,因为声明的每一个枚举值都会调用构造函数去创建实例,所以参数一定是一一对应的;既然明白了这一点,那么我们只需要在枚举类中把这 n 个参数定义为 n 个成员变量,然后提供对应的 get() 方法,...如果想让枚举类更加的好用,就可以模仿我在实战三中的写法那样,通过某一个参数值,比如 key 参数值,就能获取到其对应的枚举值,然后想要什么值,就 get 什么值就好了。...() 获取枚举的位置(下标,初始值为 0 ) valueof(String msg) 通过 msg 获取其对应的枚举类型。

    51320

    Java 语法糖

    在 JDK1.5 中,引入了泛型机制,但是泛型机制的本身是通过类型擦除 来实现的,在 JVM 中没有泛型,只有普通类型和普通方法,泛型类的类型参数,在编译时都会被擦除。...那么自动拆箱和自动装箱是如何实现的呢? 其实这背后的原理是编译器做了优化。将基本类型赋值给包装类其实是调用了包装类的 valueOf() 方法创建了一个包装类再赋值给了基本类型。...int i1 = Integer.valueOf(1); 而包装类赋值给基本类型就是调用了包装类的 xxxValue() 方法拿到基本数据类型后再进行赋值。...除此之外,编译器还会为我们生成两个方法,values() 方法和 valueOf 方法,这两个方法都是编译器为我们添加的方法,通过使用 values() 方法可以获取所有的 Enum 属性值,而通过 valueOf...方法用于获取单个的属性值。

    67194

    Java 中文官方教程 2022 版(六)

    为了实现泛型,Java 编译器对其应用类型擦除: 将泛型类型中的所有类型参数替换为它们的边界或Object(如果类型参数是无界的)。因此生成的字节码只包含普通类、接口和方法。...生成桥接方法以保留扩展泛型类型中的多态性。 类型擦除确保为参数化类型不会创建新类;因此,泛型不会产生运行时开销。...桥接方法 当编译一个继承参数化类或实现参数化接口的类或接口时,编译器可能需要创建一个合成方法,称为桥接方法,作为类型擦除过程的一部分。...为了解决这个问题并在类型擦除后保留泛型类型的多态性,Java 编译器生成一个桥接方法来确保子类型化按预期工作。...这包括原始类型、非泛型类型、原始类型和未绑定通配符的调用。 非可实例化类型 是在编译时通过类型擦除删除了信息的类型 —— 未定义为未限定通配符的泛型类型的调用。非可实例化类型在运行时不具备所有信息。

    20000

    Java 中的语法糖,真甜。

    在 JDK1.5 中,引入了泛型机制,但是泛型机制的本身是通过类型擦除 来实现的,在 JVM 中没有泛型,只有普通类型和普通方法,泛型类的类型参数,在编译时都会被擦除。...那么自动拆箱和自动装箱是如何实现的呢? 其实这背后的原理是编译器做了优化。将基本类型赋值给包装类其实是调用了包装类的 valueOf() 方法创建了一个包装类再赋值给了基本类型。...int i1 = Integer.valueOf(1); 而包装类赋值给基本类型就是调用了包装类的 xxxValue() 方法拿到基本数据类型后再进行赋值。...除此之外,编译器还会为我们生成两个方法,values() 方法和 valueOf 方法,这两个方法都是编译器为我们添加的方法,通过使用 values() 方法可以获取所有的 Enum 属性值,而通过 valueOf...方法用于获取单个的属性值。

    51820

    JVM第五卷---编译期处理

    JVM第五卷---编译期处理 编译期处理 默认构造器 自动拆装箱 泛型集合取值--泛型擦除 可变参数 foreach 循环 switch 字符串 switch 枚举 枚举类 try-with-resources...方法重写时的桥接方法 匿名内部类 插入式注解处理器 ---- 编译期处理 所谓的 语法糖 ,其实就是指 java 编译器把 *.java 源码编译为 *.class 字节码的过程中,自动生成 和转换的一些代码...擦除的是字节码上的泛型信息,可以看到 LocalVariableTypeTable 仍然保留了方法参数泛型的信息 局部变量没有办法通过反射的方式,拿到泛型信息,只有在方法的参数和返回值上带的泛型信息才可以通过反射获取到...我们都知道,方法重写时对返回值分两种情况: 父子类的返回值完全一致 子类返回值可以是父类返回值的子类(比较绕口,见下面的例子) 对于子类,java 编译器会做如下处理: 其中桥接方法比较特殊...打包自定义插入式注解: https://www.cnblogs.com/avenwu/p/4173899.html 获取类、字段:https://blog.csdn.net/zhuhai__yizhi

    90920
    领券