2013-05-30 3 views
0

У меня есть интерфейсы, расширяющие другие интерфейсы. Когда используются реализации этих интерфейсов, моя IDE (идея Eclipse и IntelliJ) не может решить класс реализации. Это не мешает компиляции кода, но очень странно, что IDE настолько неопределенна. Есть ли что-то фундаментальное, я недоразумение? Я представляю упрощенную структуру, которая описывает проблему.Наследование интерфейса Java вызывает недоумение IDE

Базовый интерфейс

public interface Avoidable { 

    public void avoid(); 

} 

Интерфейс, который расширяет базу один

public interface MostlyAvoidable extends Avoidable { 

    public void most(); 

} 

Это реализация

public class MostlyAvoidableImpl implements MostlyAvoidable { 
    @Override 
    public void most() {} 

    @Override 
    public void avoid() {} 
} 

второй расширенный интерфейс

public interface SomewhatAvoidable extends Avoidable { 

    public void somewhat(); 

} 

И его реализация

public class SomewhatAvoidableImpl implements SomewhatAvoidable { 

    @Override 
    public void avoid() {} 

    @Override 
    public void somewhat() {} 

} 

Наконец класс, который использует один из этих реализаций:

public class UsesSomewhatAvoidable { 

    private SomewhatAvoidable somewhatAvoidable; 

    public UsesSomewhatAvoidable(SomewhatAvoidable somewhatAvoidable) { 
     this.somewhatAvoidable = somewhatAvoidable; 
    } 

    public void someMethod() { 
     somewhatAvoidable.avoid(); 
    } 
} 

Теперь, если я перейти к somewhatAvoidable.avoid(); и попросите IDE найти код, который реализует метод avoid(), он спрашивает меня, имею ли я значение MostlyAvoidableImpl или SomewhatAvoidableImpl. Зачем? Неужели это может понять это?

Это то, что происходит в Идее 10.5 при нажатии Ctrl + Alt + B (правда, довольно старая версия теперь), но это также происходит в последней версии Eclipse.

Idea 10.5 behaviour

Edit: исправлена ​​опечатка в последней строке - SimplyAvoidImpl к SomewhatAvoidableImpl, и добавил скриншот.

+1

Где находится 'SimplyAvoidImpl'? –

+0

@ Code-Guru Не кажется ли вам, что это просто опечатка? – maba

+0

@maba Скорее всего. Но трудно вывести, какова должна быть коррекция. –

ответ

0

Из кода вы дали, somewhatAvoidableUsesSomewhatAvoidable классе) объявлен как SomewhatAvoidable, который является интерфейсом и не имеет реализации для метода avoid(). Компилятор (и, следовательно, IDE) не может знать, к какому классу вы хотите перейти к реализации.

+0

Но в соответствии с ОП, IDE предлагает «MostlyAvoidableImpl», который не может быть прав ... –

+0

@OliCharlesworth Хорошая точка. OP также утверждает, что IDE предлагает класс, который даже не существует в этом примере. Я намеренно избегал этих подробностей в этом ответе, потому что я не уверен, что на самом деле происходит * на конце OP. –

+0

несколькоAvoidable объявляется как SomewhatAvoidable, который реализуется SomewhatAvoidableImpl, у которого есть метод, реализующий avoid(). –

1

Несомненно, это может понять это?

Да, он должен быть в состоянии понять, что метод avoid() выполняет с помощью интерфейса, данное SomewhatAvoidable. Если в этом случае он дает совершенно другой класс (например, MostlyAvoidableImpl), то насколько я вижу, это будет ошибка (с примером, который вы дали в любом случае, я не вижу, как SomewhatAvoidable может иметь отношение к MostlyAvoidableImpl.) Возможно, вы каким-то образом запутали IDE - попробуйте очистить или перезапустить и посмотреть, не изменилось ли это.

Однако он может действительно дать вам возможность более конкретно выбирать реализацию, поскольку это не может быть определено статическим анализом (но, очевидно, одна такая реализация должна быть выбрана для правильной работы программы во время выполнения.)

+0

Это широкая проблема, которая затрагивает весь наш код и всех наших разработчиков. Я перепробовал проблему до того, что я считал представительным примером. –

3

Я взял все ваши интерфейсы и классы и настроил их в своем собственном IntelliJ, и у меня нет проблемы, которую вы описываете.

Установите каретку на методе avoid в UsesSomewhatAvoidable, а затем нажмите Ctrl + Alt + B (Go To | Implementation(s)):

enter image description here

И я в конечном итоге на реализацию в SomewhatAvoidableImpl:

enter image description here

+0

+1 за попытку воссоздать пример OPs –

+0

Спасибо, что взяли на себя эту проблему. Я предполагаю, что обновление до Idea 12 поможет (поскольку, похоже, исправлена ​​проблема, которую я описываю), но в основном это затрагивает разработчиков Eclipse. –

+0

@ ChrisWelsh Да, похоже, он работает. Возможно, это была ошибка, или она, возможно, никогда не была реализована так, как она работает сейчас. Всегда лучше использовать новейшие версии IDE. Я сам не использую Eclipse (по разным причинам), поэтому я не могу говорить за тех, кто его использует. Поэтому вам обязательно нужно перейти на версию IntelliJ версии 12. – maba

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