Могут ли переопределенные методы отличаться по типу возвращаемого значения?



можно переопределить методы различные типы возвращаемых значений?

578   9  

9 ответов:

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

например:

class ShapeBuilder {
    ...
    public Shape build() {
    ....
}

class CircleBuilder extends ShapeBuilder{
    ...
    @Override
    public Circle build() {
    ....
}

это указано в раздел 8.4.5 спецификации языка Java:

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

объявление метода d1 с типом возврата R1 является return-type-substitutable для другого метода d2 с типом возврата R2, если и только если выполняются следующие условия:

  • Если R1 является пустым, то R2 является пустым.

  • Если R1-примитивный тип, тогда R2 идентичен R1.

  • Если R1 является ссылочным типом, тогда:

    • R1 является либо подтипом R2, либо R1 может быть преобразован в подтип R2 путем непроверенного преобразования (§5.1.9), либо

    • R1 = / R2/

("|Р2|" относится к стиранию R2, как определено в §4.6 ПСБ.)


* до Java 5, Java имел инвариант возвращаемые типы, что означало тип возвращаемого переопределения метода, необходимый для точного соответствия переопределяемому методу.

да, если они возвращают подтипа. Вот пример:

package com.sandbox;

public class Sandbox {

    private static class Parent {
        public ParentReturnType run() {
            return new ParentReturnType();
        }
    }

    private static class ParentReturnType {

    }

    private static class Child extends Parent {
        @Override
        public ChildReturnType run() {
            return new ChildReturnType();
        }
    }

    private static class ChildReturnType extends ParentReturnType {
    }
}

этот код компилируется и выполняется.

Да, это может отличаться, но их некоторые ограничения.

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

вообще говоря Да Тип возврата переопределения метода может быть разным. Но его не прямо вперед есть некоторые дела, связанные с этим.

Case 1: Если возвращаемый тип является примитивным типом данных или void.

вывод: если возвращаемый тип является пустым или примитивным, то тип данных метода родительского класса и метода переопределения должен быть одинаковым. например, если возвращаемый тип-int, float, string, то он должен быть таким же

случай 2: Если возвращаемый тип данных тип:

вывод: если возвращаемый тип метода родительского класса является производным типом, то возвращаемый тип переопределяющего метода является тем же производным типом данных подкласса для производного типа данных. например, предположим у меня есть класс A B является подклассом в C является подклассом Б D-подкласс к C затем, если суперкласс возвращает тип A, то переопределяющий метод-подкласс может возвращать тип A, B, C или D, т. е. его подтипы. Это также называется ковариацией.

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

            class ParentClass {
                  public Circle() method1() {
                    return new Cirlce();
                  }
            }

            class ChildClass extends ParentClass {
                  public Square method1() {
                     return new Square();
               }
            }


            Class Cirlce {

            }

            class Square extends Circle {

            }

        ---

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

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

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

пример кода


                                                                                                            class Alpha {
          Alpha doStuff(char c) {
                  return new Alpha();
              }
           }
             class Beta extends Alpha {
                    Beta doStuff(char c) { // legal override in Java 1.5
                    return new Beta();
                    }
             } } 
Начиная с Java 5, этот код будет компилироваться. Если вы попытаетесь скомпилировать этот код с помощью компилятора 1.4, он скажет, что пытается использовать несовместимый тип возврата-sandeep1987 1 мин назад

да, это может быть возможным

class base {

 base show(){

System.out.println("base class");

return new base();

}
}

class sub extends base{

sub show(){

    System.out.println("sub class");

    return new sub();

 }
}

class inheritance{

 public static void main(String []args) {

        sub obj=new sub();

            obj.show();
 }
}

остальные ответы все правильные, но на удивление все оставляют теоретический аспект здесь: типы возврата могут быть разными, но они могут только ограничения тип, используемый в суперклассе из-за Принцип Подстановки Лискова.

это очень просто: когда у вас есть" клиент " код, который вызывает какой-то метод:

int foo = someBar.bar();

тогда выше должно работать (и вернуть что-то, что является int независимо от того, какая реализация из bar() вызывается).

значение: если есть подкласс Bar, который переопределяет bar() тогда вам все равно нужно вернуть что-то, что не нарушает "код вызывающего абонента".

другими словами: предположим, что основание bar() предполагается вернуть int. Тогда подкласс может вернуть short, но не long потому что звонящие будут хорошо иметь дело с short значение, а не long!

Comments

    Ничего не найдено.