1

什么情况下会someEnum.describeConstable()不返回EnumDesc

即它将返回一个空的Optional

4

2 回答 2

5

该方法Optional<? extends ConstantDesc> describeConstable()源于接口Constable,而不是源于Enum. 来自Constable的文档:

...

constable 类型实例的名义形式是通过describeConstable(). AConstable不需要能够(或可能选择不)以 a 的形式描述其所有实例ConstantDesc;此方法返回一个Optional可以为空的,表示无法为实例创建名义描述符。(例如,MethodHandle将为直接方法句柄生成名义描述符,但不一定是由方法句柄组合器生成的那些。)

...

请参阅 Java™ 虚拟机规范:

4.4 常量池,4.4.10 CONSTANT_InvokeDynamic_info 结构

...

于 2019-07-20T18:25:23.557 回答
5

describeConstable()是继承自 interface 的方法Constable,其中描述为:

如果可以构造,则返回包含此实例的名义描述符,如果Optional无法构造,则返回Optional

当然,在某些类中,例如Integer,它永远不能为

返回一个Optional包含此实例的名义描述符,即实例本身

但是返回值是一个,Optional因为这对于接口的所有实现都不是真的。

的 javadocConstable有这样的说法:

Constable 不需要能够(或可能选择不)以ConstantDesc;的形式描述其所有实例。此方法返回一个Optional可以为空的,表示无法为实例创建名义描述符。(例如,MethodHandle将为直接方法句柄生成名义描述符,但不一定是由方法句柄组合器生成的那些。

于 2019-07-20T18:25:52.703 回答