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

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

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

74930

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

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

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

反射这些坑,你踏空了吗?

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

54920

Java5新特性及使用

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

1.2K30

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

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

65400

3分钟快速搞懂Java方法

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

66141

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 除外)。

11110

3分钟快速搞懂Java方法

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

30050

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

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

9400

夯实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中语法糖

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

14720

夯实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 获取其对应枚举类型。

36300

Java 中语法糖有哪些呢

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

1.2K75

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

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

11600

Java 语法糖

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

63794

夯实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 获取其对应枚举类型。

50420

Java 中语法糖,真甜。

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

49120

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

86920

Java基础总结大全(3)

B:局限性:定义,在整个中有效,如果该方法调用, 当对象明确要操作类型后,所有要操作类型就被固定。...**方法放在返回前面,修饰符后面 A:为了避免局限性,让不同方法可以操作不同类型,而且类型还不确定, 则可以将定义方法上 B:特殊之处:静态方法不可以反问定义...如果静态方法操作应用数据类型不确定,可以讲定义在静态方法上 **接口: 当定义在接口上,则子类中要指定实现接口类型,同时还可以子类也可以定义 (6)高级应用:.....位于变量类型变量名之间,前后有无空格都可以; *调用可变参数方法,编译器该可变参数隐含创建一个数组, 在方法体中以数组形式访问可变参数。...**用普通如何实现枚举功能?

1.1K100
领券