Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:使用;这";作为实例方法的参数/参数名?_Java_Methods_Language Lawyer - Fatal编程技术网

Java:使用;这";作为实例方法的参数/参数名?

Java:使用;这";作为实例方法的参数/参数名?,java,methods,language-lawyer,Java,Methods,Language Lawyer,最近,我了解到以下内容似乎是合法的: class Bar { void foo(Bar this) {} } 现在,我试图在java标准中找到允许您这样做的地方,并查看了一下,但找不到该部分 是否有人可以引用它允许这种方法声明形式的地方,以及声明名为this的参数的限制是什么?它对1.8或更高版本的JDK有效 这里是 receiver参数是实例方法或内部类的构造函数的可选语法设备。对于实例方法,receiver参数表示调用该方法的对象。对于内部类的构造函数,receiver参数表示新构

最近,我了解到以下内容似乎是合法的:

class Bar {
    void foo(Bar this) {}
}
现在,我试图在java标准中找到允许您这样做的地方,并查看了一下,但找不到该部分


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

它对1.8或更高版本的JDK有效

这里是

receiver参数是实例方法或内部类的构造函数的可选语法设备。对于实例方法,receiver参数表示调用该方法的对象。对于内部类的构造函数,receiver参数表示新构造对象的直接封闭实例。无论哪种方式,receiver参数的存在只是为了允许在源代码中表示所表示对象的类型,以便可以对该类型进行注释

如果您阅读完整的要点,您会发现以下imp注释

如果允许接收器参数,则其类型和名称指定如下:

  • 在实例方法中,接收器参数的类型必须是 声明方法的类或接口,以及 接收器参数必须是这个;否则,将出现编译时错误 发生。

  • 在内部类的构造函数中,接收方参数的类型 必须是直接封闭的类或接口 内部类的类型声明,以及接收方的名称 参数必须是标识符。这里的标识符是简单的 立即封闭的类或接口的名称 内部类的类型声明;否则,将出现编译时错误 发生。


嗯。。。这一变化的原因是什么?感觉没有必要将参数命名为“this”@Gikkman最后一句解释了原因:receiver参数的存在仅仅是为了允许在源代码中表示所表示对象的类型,以便可以对该类型进行注释。虽然我认为这真的意味着:这样(隐式)参数就可以被注释了。我已经读了你的编辑5次了,但我还是不明白。我想我在这里找到了需要进一步查找的内容,谢谢:-)如果
this
可以是泛型的(由封闭类类型限定),我会发现它很有用,但似乎不是possible@Gikkman例如,考虑是否使用“检查器”为了确保映射引用在编译时有效,您可以使用一个方法
字符串lookMeUp(@KeyFor(“map”)MyClass this){return map.get(this);}
,并且它只允许您在调用该方法的对象已知是给定映射的有效键时调用该方法。这很酷。因为我知道我试图找出“JLS”的背景;但我最初的懒惰尝试失败了。多亏了你,我现在知道了!