2015-08-01 3 views
0

В частности, что происходит под капотом при компиляции/времени выполнения, что приведет к ошибке в случае несогласованности интерфейсов?Как 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 (что было реализовано в первую очередь)? Была ли она разработана для проверки согласованности во всех интерфейсах?

+0

Что вы подразумеваете под словом «он не может проверить оба в одно и то же время»? –

+4

«Почему он просто не использует определение из интерфейса1» - почему? почему бы не использовать определение из интерфейса2? почему бы не придумать новую ценность? почему бы не выбрасывать исключение? Потому что языки программирования должны быть согласованными, а поведение, которое вы хотите реализовать Java, не является: оно создаст неожиданное поведение, поэтому очень хорошо, что вы получаете ошибку компиляции! – alfasin

+1

Этот вид столкновения является необычным, но вы можете добавить возможность к списку причин, по которым помещать константы в интерфейс [считается антипаттерном] (http://stackoverflow.com/questions/29382728/constant-interface-anti- паттерн-осветление). –

ответ

2

По существу, у вас есть diamond problem - Interface1 имеет поле, а Interface2 - это поле. Оба они используются в своем классе реализации, но один из них «выигрывает» не определен. Что, если Interface1.NUM было 100 и Interface2.NUM было 1000? Каким было бы поведение? Что, если поведение было непоследовательным - иногда во время пробегов оно становилось 100, а иногда и 1000?

Это неоднозначно, относительно которого NUM было определено «первым». Нет спецификации, по которой интерфейс фактически принимается как «первый» в последовательности. Java не знает достаточно о реализации, чтобы доверять одной реализации по другой, поэтому она отказывается - обе они слишком неоднозначны, чтобы позволить runtime вызывать суждение.

+0

Это не настоящий узор с бриллиантами; нет общего базового класса. –

Смежные вопросы