Stavo pulendo il codice e cambiando tutti gli accessi al membro statico in modo tale che siano qualificati dalla classe in cui sono definiti. Questo, tuttavia, porta al seguente problema che mi sta sconcertando.Dovrebbero essere visibili campi statici privati dalla classe annidata quando qualificati da quello circostante?
Ho una classe con una classe annidata dentro. Nell'annotazione su questa classe nidificata faccio riferimento a un campo finale statico privato nella classe circostante. Quando si esegue questa operazione senza qualifica (come nell'annotazione sulla classe D, di seguito) funziona. Tuttavia, quando si aggiunge il qualificatore di classe (come nell'annotazione sulla classe C) il compilatore dice al campo (v sotto) non è visibile.
public class VisibilityTest {
@interface A {
int f();
}
@A(f = VisibilityTest.v) //fails
private static class C {
int c = VisibilityTest.v; //works
}
@A(f = v) //works
private static class D {
int d = VisibilityTest.v; //works
}
private final static int v = 5;
}
In entrambi i casi la variabile fa riferimento allo stesso campo, quindi perché ciò accade?
Non ne ho idea, ma interessante, soprattutto perché il 'linguaggio OuterClass.privateStaticField' compilerà quando si fa riferimento, ad esempio, all'interno di un metodo di una classe annidata, che sembra in contrasto ... – Mena
Poiché i parametri di annotazione deve essere a tempo di compilazione risolvibile (nel nostro caso, espressioni costanti), questo sembra essere un problema tecnico nel compilatore. – biziclop
quale versione di javac è usata? – hahn