В частности, что происходит под капотом при компиляции/времени выполнения, что приведет к ошибке в случае несогласованности интерфейсов?Как Java определяет, являются ли интерфейсы непоследовательными?
Пример интерфейса:
public interface Interface1 {
int NUM = 0;
}
public interface Interface2 {
int NUM = 1;
}
Это имеет ошибку компилятора:
public class Test implements Interface1, Interface2 {
public static void main(String[] args) {
System.out.println(NUM);
}
}
Это работает просто отлично:
public class Test implements Interface1, Interface2 {
public static void main(String[] args) {
System.out.println("anything");
}
}
Когда Java встречает NUM
он находит определение из интерфейса , Он не может проверить оба одновременно, так почему же он просто не использует определение от Interface1
(что было реализовано в первую очередь)? Была ли она разработана для проверки согласованности во всех интерфейсах?
Что вы подразумеваете под словом «он не может проверить оба в одно и то же время»? –
«Почему он просто не использует определение из интерфейса1» - почему? почему бы не использовать определение из интерфейса2? почему бы не придумать новую ценность? почему бы не выбрасывать исключение? Потому что языки программирования должны быть согласованными, а поведение, которое вы хотите реализовать Java, не является: оно создаст неожиданное поведение, поэтому очень хорошо, что вы получаете ошибку компиляции! – alfasin
Этот вид столкновения является необычным, но вы можете добавить возможность к списку причин, по которым помещать константы в интерфейс [считается антипаттерном] (http://stackoverflow.com/questions/29382728/constant-interface-anti- паттерн-осветление). –