SE8の言語仕様変更としてTypeAnnotationで導入されたレシーバパラメータがある。
JavaSE8からはレシーバパラメータとして仮引数にthisを書くことができるようになる。
たとえば、今までインスタンスメソッドを定義する場合には次のように書いていた。
class C
{
void m(int n1, int n2){}
}
JavaSE8では以下のように第一引数にレシーバとしてthisを書くことができるようになった。
class C
{
void m(C this, int n1, int n2){}
}
この時thisの型はメソッドmが属する型(クラスかインターフェース)を指していなければならない。
今回の場合はクラスCとなっていなければならない。
これはメソッドにおいてthisの型を型アノテーションで注釈したい場合のための機能となる。
例えばTAnnoという型アノテーションがありメソッドmで自分自身のクラスを修飾したい場合、レシーバパラメータを用いて次のように書くことができる。
class C
{
void m(@TAnno C this, int n1, int n2){}
}
インナークラスのコンストラクタにおいてもこの特徴を利用することができる。
その場合はアウタークラスのthisを第一引数に指定する。
また、その際の変数名は、コンストラクタ内で参照するのと同じようにOuterClass.thisとthisの前にアウタークラスを加える。
class Outer
{
class Inner
{
Inner(Outer Outer.this, int arg1, int arg2){}
void m(Inner this, int n1, int n2){}
}
}
thisの型がわかりやすくなる。
匿名クラスとラムダ式ではこの特徴を利用することができない。
匿名クラスでは自分自身の型を表現する方法が無いことによる。