Переопределение метода с различными типами возвращаемых значений в java?

Я прочитал книгу, и она говорит, что я могу переопределить метод, если он имеет одну и ту же подпись. согласно книге подпись метода - это имя метода_имя + переданные параметры.

в соответствии с книгой, я могу переопределить метод, который имеет разные типы возвращаемых данных. Возможно ли переопределить метод с другим возвращаемым типом в Java? потому что я сделал некоторый поиск в сети, я обнаружил, что люди говорят, что для переопределения метода возвращаемый тип должен быть таким же.

в соответствии с книгой также говорится, что java выкинет ошибку компиляции, когда мы попытаемся перегрузить метод с тем же именем и параметрами метода, но разными типами возврата, поскольку подпись означает только имя метода и параметры. Если это так, мы должны переопределить метод с другим типом возвращаемого значения.

Пожалуйста, помогите мне понять это. Спасибо заранее.

7 ответов

Вы можете вернуть другой тип, если он совместим с типом возвращаемого метода переопределения. Совместимые средства: это подкласс, суб-интерфейс или реализация класса или интерфейса, возвращаемого переопределенным методом.

И это логично. Если метод возвращает Animal, а ваш производный класс возвращает корову, вы не нарушаете контракт над методом суперкласса, так как корова - это Animal. Если производный класс возвращает банану, это неверно, так как банан не является животным.


Ваш родительский класс дал обещание внешнему миру. Например, метод:

public Price calculatePrice(Items[] items).

Это говорит миру, что ожидает Цена.

Если вы улучшите эту функциональность в своем подклассе, вам все равно нужно сохранить исходные классы родительских классов promises.

Вы можете добавить перегруженные способы расчета:

public Price calculatePrice(Items[] items, Integer minimumCharge).

Вы даже можете улучшить свой родительский promises с помощью БОЛЬШЕ определенного типа возврата:

public AccuratePrice calculatePrice(Items[] items, Integer minimumCharge).

Но вы должны вернуть хотя бы тот тип, который обещал ваш родитель. То же самое относится и к исключениям в объявлении метода.


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

class X implements Cloneable {
 @Override
 protected X clone() {
 try {
 return (X) super.clone();
 } catch (CloneNotSupportedException e) {
 throw new Error(e); // can never happen
 }
 }
}


Вот пример:

class Base {
 public Number test() {
 return 0;
 }
}
class A extends Base {
 public Long test() {
 return 1L;
 }
}


Ваш метод overriden может иметь тот же тип или подтип оригинальный тип возврата, который называется ковариантным возвратом.

Если вы измените тип возврата метода overriden на что-то еще, что не является подтипом исходного типа, тогда вы получите ошибку времени компиляции.


Yes we can override different return types but they should be subclass.
public class Shape {
 public Shape area(Integer i) {
 System.out.println("Sape Area");
 System.out.println("Integer");
 return null;
 }
}
package com.oops;
public class Circle extends Shape {
 public Circle area(Integer i) {
 System.out.println("Circle Area");
 System.out.println("int");
 return null;
 }
}


// Covariant Overriding 
public class Parent {
 public Parent(){}
 String parentName;
 public Parent(String parentName){
 this.parentName=parentName;
 System.out.println(this.parentName);
 }
public Parent show(){
 return new Parent("Parent");
}
}
public class Child extends Parent{
 public Child(){}
 String name;
 public Child(String name){
 this.name=name;
 System.out.println(this.name);
 }
 public Child show(){
 return new Child("Child");
}
}
public class Main {
public static void main(String[] args) {
 Parent parent=new Child();
 parent.show();
 Parent parent1=new Parent();
 parent1.show();
}
}

licensed under cc by-sa 3.0 with attribution.