Переопределение метода с различными типами возврата в 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();
}
}