Переопределение метода с различными типами возвращаемых значений в java?
Я прочитал книгу, и она говорит, что я могу переопределить метод, если он имеет одну и ту же подпись. согласно книге подпись метода - это имя метода_имя + переданные параметры.
в соответствии с книгой, я могу переопределить метод, который имеет разные типы возвращаемых данных. Возможно ли переопределить метод с другим возвращаемым типом в Java? потому что я сделал некоторый поиск в сети, я обнаружил, что люди говорят, что для переопределения метода возвращаемый тип должен быть таким же.
в соответствии с книгой также говорится, что java выкинет ошибку компиляции, когда мы попытаемся перегрузить метод с тем же именем и параметрами метода, но разными типами возврата, поскольку подпись означает только имя метода и параметры. Если это так, мы должны переопределить метод с другим типом возвращаемого значения.
Пожалуйста, помогите мне понять это. Спасибо заранее.
Ответы
Ответ 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();
}
}