2014-02-16 2 views
1

яВозвращаемый тип несовместим с <Interface.functionName>

"Возвращаемый тип несовместим с Bar.doClick()"

import some.library.Bar 

public class Foo implements Bar { 

    public enum Outcome { 
     ONE, TWO, THREE, NEW; 
    } 

    public Outcome doClick() { 
     return Outcome.NEW; 
    } 
} 

Даст мне ошибку, почему ? Я пытаюсь вернуть правильный тип, который я думал.

Bar.class содержит следующие строки:

public enum Outcome { 
     ONE, TWO, THREE, NEW; 
    } 
    Outcome doClick(); 

Я рассказанные Затмения, что если я изменю

public Outcome doClick() { 
    return Outcome.NEW; 
} 

в

public Bar.Outcome doClick() { 
    return Outcome.NEW; 
} 

я могу решить эту ошибку, но создать новый на моей обратной линии. Я думаю, что я действительно потерял принципиальное значение здесь и могу использовать какое-то фундаментальное понимание.

+0

У вас может быть меньше проблем, если вы дадите разные имена enum. – Maroun

+0

Пожалуйста, не добавляйте сам ответ в вопрос; вы можете ответить на свой вопрос, если сначала разрешите его, и, приняв ответ Сотириоса, вы уже по существу отметили, что этот вопрос разрешен. –

+0

Сотириос привел меня к правильному ответу, поэтому я пометил свой ответ для точечной системы, но код в его сообщении не сразу описал мое решение, поэтому я также разместил свое решение. Полагаю, я буду воздерживаться от этого в будущем. – user1695505

ответ

4

В вашем интерфейсе Bar, Outcome относится к члену enum, который вы указали внутри Bar. Поэтому абстрактный метод doClick() имеет тип возврата Bar.Outcome.

В вашем классе Foo вы объявляете еще одного члена enum, также называемого Outcome. Метод doClick, ошибочно объявленный в Bar, имеет тип возврата Foo.Outcome. Поскольку сигнатура метода не учитывает тип возвращаемого значения, вы фактически иметь этот

public Outcome doClick() { 
    return Outcome.NEW; 
} 

public Bar.Outcome doClick() { 
    return Outcome.NEW; 
} 

, который вызовет ошибку компиляции, потому что у вас есть повторяющиеся методы.

Ваш метод doClick() должен вернуть объект Bar.Outcome для реализации (удовлетворения) интерфейса Bar.

public Bar.Outcome doClick() { 
    return Bar.Outcome.NEW; 
} 

Из-за затенения

return Outcome.NEW; 

имел в виду Foo.Outcome.NEW, который не относится к типу, который Bar.Outcome ожидаемый тип возвращаемого.

Я не знаю, почему вы объявили два перечисления с тем же именем.

+0

Я пытался реализовать интерфейс, который уже содержит эти поля. И похоже, что я могу избежать вызова Bar.Outcome doClick(), если я удалю свою вторую декларацию enum.Спасибо за помощь, это помогло мне понять многое! – user1695505

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