Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

public Price calculatePrice(Items[] items).

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

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

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

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

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

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

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

Ответ 3

Да, это возможно, так как 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
        }
    }
}

Ответ 4

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

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

Ответ 5

Вот пример:

class Base {
    public Number test() {
        return 0;
    }
}

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

Ответ 6

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

Ответ 7

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