Java 与JVM规范中ClasseSinotherpkWithProtectedMember的混淆,以及更普遍的访问受保护成员的规则

Java 与JVM规范中ClasseSinotherpkWithProtectedMember的混淆,以及更普遍的访问受保护成员的规则,java,prolog,jvm,specifications,jls,Java,Prolog,Jvm,Specifications,Jls,Java声明: 如果List是链中名为MemberClassName的类的集合,且该类与名为MemberDescriptor的受保护成员MemberName的类位于不同的运行时包中,则谓词ClasseSinotherpkWithProtectedMember(类、MemberName、MemberDescriptor、MemberClassName、链、列表)为true 然而,查看classesinotherpkwithprotectedmember(如上)的定义,我们可以看到classesin

Java声明:

如果List是链中名为MemberClassName的类的集合,且该类与名为MemberDescriptor的受保护成员MemberName的类位于不同的运行时包中,则谓词ClasseSinotherpkWithProtectedMember(类、MemberName、MemberDescriptor、MemberClassName、链、列表)为true

然而,查看
classesinotherpkwithprotectedmember
(如上)的定义,我们可以看到
classesinotherpkwithprotectedmember
的def总是从Chain中弹出
类(MemberClassName,L)
。给定下面这样一个简单的超类链,
classesinotherpkwithprotectedmember
将始终失败,因为它无法为链中的每个元素弹出具有相同名称的类。更具体地说,它必须始终弹出名为
MemberClassName
的类

    class('java/util/HashMap',bootstrapLoader)
    class('java/util/AbstractMap',bootstrapLoader),
    class('java/lang/Object',bootstrapLoader)

是我误解了这个序言代码,还是
classesinotherpkwithprotectedmember
对于
Chain
的所有非平凡值都失败了?这是否以某种方式依赖回溯来获得更简单的
,然后可以成功?是否存在某种灵活的名称概念,有时
MemberClassName
指的是非限定名称,有时指的是名称+包?是否应该有一个
MemberClassName1
和一个
MemberCLassName2
,这样就不会每次都从链中弹出相同的类?

也许我应该标记这个prolog,让一些prolog程序员查看它。
给定一个简单的超类链,如下面所示,classesinotherpkwithprotectedmember总是会失败,因为它不能为链中的每个元素弹出一个同名的类。
为什么这么说?我的问题正文中有大写的序言。@GuyCoder我怀疑是否有“真正的代码运行”。这些Prolog代码片段用于指定验证器的约束,但我确信每个实际的验证器都是用C/C++或Java之类的语言实现的。了解这些实现与这些Prolog片段所要求的逻辑之间的距离会很有趣。我已经就规范语言的选择和规范的预期目标受众之间的明显不匹配发表了评论,但是它已经被删除了。@GuyCoder看起来,你误解了我的评论。我是说,链接规范中的信息就是我们所能得到的。除了甲骨文未公开的内容之外,没有其他信息。该规范的作者希望我们的读者能够在我们的大脑中解释代码,从而得出应该做什么的结论,例如,当用任何语言实现一个实际的验证器时。我不能那样做。如果像您这样有经验的Prolog程序员说,如果没有进一步的信息,这是不可能的,我们将不得不告诉Oracle,规范是不完整的。
    class('java/util/HashMap',bootstrapLoader)
    class('java/util/AbstractMap',bootstrapLoader),
    class('java/lang/Object',bootstrapLoader)