什么情况下会someEnum.describeConstable()不返回EnumDesc?
即它将返回一个空的Optional。
该方法Optional<? extends ConstantDesc> describeConstable()源于接口Constable,而不是源于Enum. 来自Constable的文档:
...
constable 类型实例的名义形式是通过
describeConstable(). AConstable不需要能够(或可能选择不)以 a 的形式描述其所有实例ConstantDesc;此方法返回一个Optional可以为空的,表示无法为实例创建名义描述符。(例如,MethodHandle将为直接方法句柄生成名义描述符,但不一定是由方法句柄组合器生成的那些。)...
请参阅 Java™ 虚拟机规范:
4.4 常量池,4.4.10 CONSTANT_InvokeDynamic_info 结构
...
describeConstable()是继承自 interface 的方法Constable,其中描述为:
如果可以构造,则返回包含此实例的名义描述符,如果
Optional无法构造,则返回空Optional。
当然,在某些类中,例如Integer,它永远不能为空:
返回一个
Optional包含此实例的名义描述符,即实例本身。
但是返回值是一个,Optional因为这对于接口的所有实现都不是真的。
的 javadocConstable有这样的说法:
Constable 不需要能够(或可能选择不)以
ConstantDesc;的形式描述其所有实例。此方法返回一个Optional可以为空的,表示无法为实例创建名义描述符。(例如,MethodHandle将为直接方法句柄生成名义描述符,但不一定是由方法句柄组合器生成的那些。)