2016-09-16 71 views
11

最近from this question据我了解,下面似乎是合法的Java:Java:使用“this”作为实例方法的参数/参数名称?

class Bar { 
    void foo(Bar this) {} 
} 

现在,我试图找到其中的Java标准它说,你被允许这样做,看着here,但我找不到该部分。

有人可以引用它允许这种形式的方法声明以及声明名为this的参数的限制是什么?

+0

这很酷。因为我知道我试图想出这个“JLS”背景;但我最初的懒惰尝试失败。感谢你,我现在知道! – GhostCat

回答

12

它适用于1.8或更高版本的JDK。

这里是JLS saying that

接收机参数是一个实例方法或内部类的构造可选句法设备。对于实例方法,receiver参数表示调用该方法的对象。对于内部类的构造函数,receiver参数表示新构造对象的立即封闭实例。无论采用哪种方式,接收者参数都只存在于允许表示对象的类型在源代码中表示,以便该类型可能被注释。

如果你读你会发现下面的小鬼注解的全部要点,

当一个接收机参数是允许的,其类型和名称具体如下:

  • 在实例方法中,接收者参数的类型必须是声明方法的 类或接口,并且名称为 接收器参数必须是这个;否则,发生编译时错误 。

  • 在一个内部类的构造函数,该接收器参数 的类型必须是类或接口,其是内部类的立即封闭 类型声明,并且接收机 参数的名称必须是标识符。这里标识符是简单的 类或接口的名称,它是立即包含内部类的 类型声明;否则,发生编译时错误 。

+0

呃......这个改变的原因是什么?感觉没有必要能够命名参数'this' – Gikkman

+2

@Gikkman最后一句解释了为什么:*接收器参数的存在仅仅是为了允许表示对象的类型在源代码中表示**,所以类型可能被注释**。*尽管我认为它确实意味着:使(隐含)*参数*可能被注释。 – Andreas

+1

我读过你的编辑5次,我仍然没有得到它。猜猜我发现了一些东西,我需要在这里进一步查找,谢谢:-) – Gikkman