Aşağıdaki sınıf, bir anonim iç sınıf örneği ile başlatılan runnable
üye değişkeni içerir. iç sınıf aynı elemanı referanslar:Neden Java 8'deki lambdas, anonim sınıfların bulunmadığı üye değişkenlerine referans göndermez?
class Example {
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println(runnable);
}
};
}
Bu sürece birine tahsis JLS bir referansı edilmeden önce bir yöntem yürütülmez gibi bir sorun değildir. Aşağıdaki ile javac 1.8.0_05
tarafından Anladığım kadarıyla
Runnable runnable =() -> System.out.println(runnable);
, bu önceki örneğe işlevsel olarak eşdeğer, ancak reddedilir:
üye değişkeni beyanı teorik böyle bir lambda ifadesi dönüştürülebilir olabilir Hata iletisi:
Error:(2, 54) java: self-reference in initializer
Bu ifade doğru olsa da, bunun neden izin verilmediğini anlamıyorum. Bu kasten izin verilmiyordu, belki de lambda ifadeleri izin verirse sorunlara yol açacak farklı bayt koduna derlenmişlerdir? Ya da sadece izin verilmiyordu çünkü bu referanslar ile anonim iç sınıflarda kullanıldığında problemler vardı. Ya da JLS yazarları tarafından kasıtsız olarak izin verilmiyor muydu? Yoksa javac
'da bir hata mı? Tam olarak bunu açıklar.
Tutulma sırasında, bu çalışır: 'Runnable runnable =() -> System.out.println (bu.runnable); 'Sadece bu 'niteleyici eklenmeden başarısız. –