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

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

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

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

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

7 ответов


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

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


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

public Price calculatePrice(Items[] items).

это говорит миру ожидать цену.

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

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

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

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

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;
    }
}

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

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


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();
}
}