Jestem trochę zmieszany z różnymi zachowaniami anonimowej klasy i wyrażeniem lambda.Wartość "this" w anonimowej klasie w stosunku do wyrażenia lambda
Kiedy używam wyrażenia lambda:
//Test.java
Runnable r1 =() -> System.out.println(this);
Runnable r2 =() -> System.out.println(toString());
@Override
public String toString() {
return "Hello World!";
}
// in main method
new Test().r1.run();
new Test().r2.run();
Output : Hello World!
Hello World!
Podczas korzystania anonimową klasę:
Runnable r1 = new Runnable() {
@Override
public void run() {
System.out.println(this);
}
};
Runnable r2 = new Runnable() {
@Override
public void run() {
System.out.println(toString());
}
};
@Override
public String toString() {
return "Hello World!";
}
// in main method
new Test().r1.run();
new Test().r2.run();
Output : [email protected]
[email protected]
Czy ktoś mógłby wyjaśnić różne zachowanie?
Dzięki za odpowiedź :), ale co jest leksykalnie związane? –
@MehrajMalik Oznacza to, że są one powiązane w czasie kompilacji w zależności od kontekstu, w jakim zostały znalezione. – 4castle
To nie tylko wpływa na 'ten' i' super'. Wewnątrz anonimowej klasy wewnętrznej mogą istnieć dziedziczone elementy (nie tylko 'toString()'), podczas gdy wyrażenie lambda niczego nie dziedziczy po interfejsie funkcjonalnym. – Holger