In realtà ho bisogno di sapere in fase di compilazione che un elenco non modificabile viene modificato.
Questo non è possibile.
O almeno, non è possibile senza creare una gerarchia di interfaccia/classe di collezioni completamente diversa. E questa è una cattiva idea, perché niente di progettato per usare collezioni regolari funzionerebbe con esso.
suppongo che sarebbe stato possibile scrivere un analizzatore di codice statico che potrebbe rilevare questo genere di cose ... in alcuni casi ... ma questo non è strettamente "fase di compilazione". Inoltre, non sono a conoscenza di alcun analizzatore di codice statico esistente che faccia questo "out of the box".
Mi chiedo se ci fosse una ragione perché l'hanno fatto in questo modo.
Ebbene nessuno dei modi si potrebbe fare questo funziona davvero.
Alternativa # 1:
public interface UnmodifiableList<T> {
public T get(int pos);
....
}
public interface List<T> extends UnmodifiableList<T> {
public void add(T elem);
....
}
Mentre tipizzazione statica ci può impedire di utilizzare un elenco non modificabile in cui è richiesto uno modificabili, il contrario non è vero. Ogni lista è anche una lista non modificabile ... e questo non ha molto senso.
Alternativa 2:
public interface List <T> {
public T get(int pos);
public void add(T elem);
....
}
public interface UnmodifiableList<T> {
// A marker interface
}
tipizzazione statica Ora ci può impedire di utilizzare un elenco modificabile in cui è richiesta una umodifiable, ma non il contrario. (Ciò soddisfa le tue esigenze ...) Inoltre, una classe che implementa UnmodifiableList
eredita comunque l'operazione add
e non c'è nulla che impedisca a un'applicazione di provare a chiamarla.
In breve, i sistemi di tipo statico non sono in grado di gestire adeguatamente questo tipo di restrizione.
fonte
2012-05-07 10:50:48
Mi chiedo se ci fosse un motivo per cui l'abbiano fatto in questo modo. :( –
Come regola generale, è necessario codificare le interfacce anziché le classi di runtime effettive. "Collections.unmodifiableList' è progettato, in effetti, per forzare l'utente a codificare nell'interfaccia. –
@LouisWasserman - Non penso che sia rilevante alle domande di follow-up dell'OP, cioè quelle che sto rispondendo –