【问题标题】:paradox about receiver parameter in jls-8.4 and jls-8.8.1关于 jls-8.4 和 jls-8.8.1 中接收器参数的悖论
【发布时间】:2022-11-16 22:32:51
【问题描述】:

jls-8.4 指出

接收者参数是一个可选的语法设备,用于实例方法或 内部类的构造函数。对于实例方法,接收者参数表示 调用该方法的对象。对于内部类的构造函数, 接收者参数表示新接收者的直接封闭实例 构造的对象。

jls-8.4.1中也有例子,注意高亮部分

但是,jls-8.8.1 指出

非私有内部成员类的构造函数隐式声明为 第一个形式参数,一个代表直接封闭实例的变量 班级的

所以在jls-8.8.1中,上面例子中高亮的构造函数中的参数应该叫做形参。类文件结构符合它,因为我可以在方法描述符和构造函数的MethodParameters属性中找到这个参数。

但显然接收参数和形式参数在 jls 中是两个不同的东西,请参阅 jls-8.4 中的Method Declaration,jls-8.4.1 中的Formal Parameters和 jls-8.8 中的Constructor Declaration

jls 中这样的参数的正确类型是什么?

【问题讨论】:

    标签: java jls


    【解决方案1】:

    术语formal parameter在§8.4.1中定义;基本上,它只是表示一个参数。维基百科explains

    期限范围(有时称为形式参数) 通常用于引用函数定义中的变量,而争论(有时称为实际参数) 指的是函数调用时提供的实际输入。

    术语“形式参数”可能被类比为数学中的formal variable 概念。接收者参数是一种特殊的形式参数。

    【讨论】:

    • 我不太同意你最后的说法,在规范中它们实际上是两种参数,并且接收器参数不会以方法描述符或jvm类文件格式的MethodParameters属性结尾。
    • 我正在阅读 java19 规范,它看起来可能与 java8 规范有些不同。但在 java8 规范中,FormalParameterReceiverParameter 仍然是两个定义。如果它像你说的那样,那么定义应该是这样的:FormalParameter: ReceiverParameter | {some other difinitions}
    猜你喜欢
    • 2020-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-28
    • 1970-01-01
    • 2014-02-18
    • 2016-06-02
    • 1970-01-01
    相关资源
    最近更新 更多