2013-10-14 3 views
-4

у меня есть интерфейс и абстрактный класс:Ошибка компиляции с интерфейсами и абстрактными классами

interface MyInterface {int presents();}; 

public abstract class MyAbstractClass implements MyInterface { 
    abstract void presents(); 
    abstract void chill(); 
} 

Компилятор жалуется, что в

abstract void presents(); 

Возвращаемый тип несовместим с

MyInterface.presents() 

Предлагаемые варианты:

make it int type 
make MyInterface.presents void type 

Почему это происходит?

+7

Не допустили ли ошибки компилятора? –

+2

аннотация void presents(); имеет возвращаемый тип void, в то время как представление интерфейса() имеет тип возврата int ... Чувак серьезно? – Thihara

+3

И теперь он сбрасывает все правильные ответы. – chrylis

ответ

8

Вы определили метод presents(), который возвращает int в Gift интерфейсе. Затем вы пытаетесь переопределить метод presents() с обратным типом void в классе с именем myClass.

Совершенно очевидно, что int не является void. Это означает, что тип возврата несовместим.

Вы вводите в заблуждение с наследованием методов. Проблема заключается в том, что синтаксис Java (и все C-подобные языки) не диктует использование возвращаемого значения, так что даже если вы метод возвращает int вы все еще можете назвать это как следующее:

presents();

Итак, предположим, этот компилятор позволяет вам иметь 2 разных метода с именем presents(): тот, который возвращает int, другие возвращает void. Как компилятор может понять, какой из методов использовать в нашем примере? Ответ никоим образом. Это является причиной того, что вы можете переопределять методы с использованием подписи различных параметров, например.

presents(); 
presents(String str); 
presents(int n); 

Вы не можете иметь 2 метода с одинаковыми сигнатурами параметров и другим типом возврата.

4

В интерфейсе presents определяется как возвращающий int, но в вашем классе, который утверждает, что реализует интерфейс, это void. Эти два должны совпадать.

3

Потому что интерфейс имеет метод presents(), и вы пытаетесь изменить здесь подпись метода.

Если вы не хотите, чтобы этот метод написал новый.

abstract void anotherPresents(); 

или

удовлетворяют исходной подписи

abstract int presents(); 
Смежные вопросы