Java - ошибка: возвращаемый тип несовместим - PullRequest
6 голосов
/ 16 мая 2011

Я учу Java. Я пытался запустить код, где я получил эту ошибку: return type is incompatible. Часть кода, где он показал мне ошибку.

class A {
    public void eat() { }
}

class B extends A {
    public boolean eat() { }
}

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

Ответы [ 5 ]

9 голосов
/ 16 мая 2011

Это потому, что у нас не может быть двух методов в классах с одинаковыми именами, но с разными типами возвращаемых данных.

Подкласс не может объявить метод с тем же именем уже существующего метода в суперклассе с другим типом возвращаемого значения.

Однако подкласс может объявить метод с той же сигнатурой, что и в суперклассе. Мы называем это «Переопределение».

Тебе нужно это,

class A {
    public void eat() { }
}

class B extends A {
    public void eat() { }
}

OR

class A {
    public boolean eat() { 
        // return something...
    }
}

class B extends A {
    public boolean eat() { 
        // return something...
    }
}

Хорошей практикой является маркировка перезаписанных методов аннотацией @Override:

class A {
    public void eat() { }
}

class B extends A {
    @Override
    public void eat() { }
}
2 голосов
/ 21 мая 2011

Когда метод в подклассе имеет то же имя и аргументы (их типы, число и порядок), что и метод в суперклассе, тогда метод в подклассе переопределяет метод в суперклассе.

Теперь переопределение должно бытьДопустимый тип возврата метода в подклассе должен соответствовать возвращаемому методу метода в суперклассе.Это возможно только в том случае, если тип возвращаемого значения метода в подклассе равен ковариантному с типом возвращаемого значения метода в суперклассе.

С тех пор, boolean </: void (читай: boolean не является подтипомvoid), компилятор выдает ошибку «несовместимый тип возвращаемого значения».

2 голосов
/ 16 мая 2011

B extends A следует интерпретировать как B является A.

Если метод A ничего не возвращает, B должен сделать то же самое.

2 голосов
/ 16 мая 2011

если B расширяет A, то вы можете переопределить методы (например, eat), но вы не можете изменить их подписи. Итак, ваш B класс должен быть

 class B extends A {
        public void eat() { }
 }
0 голосов
/ 03 июня 2014

Это не перегрузка и не переопределение. Мы не можем перегрузить тип возвращаемого значения и не можем переопределить его с помощью различных типов возвращаемого значения (если только они не являются ковариантными возвращениями в Java 1.5).

...