En realidad, necesito saber en tiempo de compilación que se está modificando una lista no modificable.
Eso no es posible.
O al menos, no es posible sin crear una jerarquía de clase/interfaz de colecciones completamente diferente. Y esa es una mala idea porque nada diseñado para usar colecciones regulares funcionaría con eso.
Supongo que sería posible escribir un analizador de código estático que pudiera detectar este tipo de cosas ... en algunos casos ... pero eso no es estrictamente "tiempo de compilación". Además, no conozco ningún analizador de código estático existente que haga esto "fuera de la caja".
Me pregunto si había una razón por qué lo hicieron así.
bien ninguna de las maneras que usted puede ser que hacer esto realmente funciona.
Alternativa # 1:
public interface UnmodifiableList<T> {
public T get(int pos);
....
}
public interface List<T> extends UnmodifiableList<T> {
public void add(T elem);
....
}
Mientras tipos estáticos puede evitar que el uso de una lista no modificable donde se requiere una modificables, lo contrario no es cierto. Cada lista es también una lista inmodificable ... y eso realmente no tiene sentido.
Alternativa 2:
public interface List <T> {
public T get(int pos);
public void add(T elem);
....
}
public interface UnmodifiableList<T> {
// A marker interface
}
tipificación estática Ahora nos puede evitar que utilice una lista modificable, donde se requiere una umodifiable uno, pero no a la inversa. (Eso satisface sus requisitos ...) Además, una clase que implementa UnmodifiableList
sigue heredando la operación add
, y no hay nada que impida que una aplicación intente llamarlo.
En resumen, los sistemas de tipo estático no pueden manejar adecuadamente este tipo de restricciones.
Me pregunto si hubo una razón por la que lo hicieron así. :( –
Como regla general, debe codificar las interfaces en lugar de clases de tiempo de ejecución reales. Collections.unmodifiableList está diseñado, de hecho, para forzarle a codificar en la interfaz. –
@LouisWasserman - No creo que sea relevante a las preguntas de seguimiento de la OP, es decir, a las que estoy respondiendo. –