2016-02-09 16 views
5

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?

+2

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

+0

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

+0

quale versione di javac è usata? – hahn

risposta

4

Questo compila bene con 1.8.0_25 e 1.7.0_45 javac, come dovrebbe davvero. O entrambi dovrebbero fallire, anche questo sarebbe coerente.

questo sembra essere un bug nella gestione di annotazione di Eclipse (che è il motivo per cui si può tranquillamente fare riferimento allo stesso costante dal codice normale), è stato reported molto tempo fa, ma non c'è beeen molta attività nel corso degli ultimi 4 anni.

+0

Sono anche riuscito a compilare direttamente con javac senza problemi. In effetti sto usando Eclipse, quindi molto probabilmente è lo stesso bug – miselico

+0

@miselico Dato che è così facile aggirarlo, mi aspetterei che fosse abbastanza lungo l'elenco di bug da correggere. Il compilatore di Eclipse ha problemi ben più grandi di questo :) – biziclop

-2

Vedere How to supply value to an annotation from a Constant java.

Fondamentalmente non è possibile. I valori di annotazione devono essere primitivi o stringhe. Non puoi fare riferimento a un campo, privato o altro.

+0

Poiché il tipo di 'v' è' int', un riferimento ad esso è un'espressione costante ed è quindi valido. – biziclop

Problemi correlati