TestClass.this.onError(error);
これはJavaのキーワークだと思いますが、どのようにクラス名をこれに続けることができますか? これはJavaの特別な機能ですか?
TestClass.this.onError(error);
これはJavaのキーワークだと思いますが、どのようにクラス名をこれに続けることができますか? これはJavaの特別な機能ですか?
これは、内側のクラス内から外側のクラスの暗黙的なインスタンスにアクセスする方法です。例えば:
public class Test {
private final String name;
public Test(String name) {
this.name = name;
}
public static void main(String[] args) {
Test t = new Test("Jon");
// Create an instance of NamePrinter with a reference to the new instance
// as the enclosing instance.
Runnable r = t.new NamePrinter();
r.run();
}
private class NamePrinter implements Runnable {
@Override public void run() {
// Use the enclosing instance's name variable
System.out.println(Test.this.name);
}
}
}
内部クラスとそれを囲むインスタンスの詳細については、Java 言語仕様のセクション 8.1.3を参照してください。「修飾された」式については、セクション 15.8.4を参照してください。this
字句的に囲んでいるインスタンス (§8.1.3) は、キーワード this を明示的に修飾することで参照できます。
で示さ
C
れるクラスとしClassName
ます。C
nは、修飾された this 式が現れるクラスの n 番目の字句的に囲んでいるクラスであるような整数であるとします。フォームの式の値は、
ClassName.this
辞書的にこれを囲んでいる n 番目のインスタンスです。式の型は
C
.
内部クラスから、それを含む TestClass のインスタンスからインスタント メソッドを呼び出しています。
クラスの内部クラスから使用でき、外部クラスを参照します。
たとえば、クラス Cat がある場合
public class Cat {
private int age;
private Tail tail;
public Cat(int age) {
this.age = age;
this.tail = new Tail();
}
class Tail {
public void wave() {
for(int i = 0; i < Cat.this.age; i++) {
System.out.println("*wave*");
}
}
}
public Tail getTail() {
return tail;
}
/**
* @param args
*/
public static void main(String[] args) {
new Cat(10).getTail().wave();
}
}