programing

공변량 반환 유형이란 무엇입니까?

javaba 2022. 9. 3. 23:48
반응형

공변량 반환 유형이란 무엇입니까?

Java에서 공변 반환 유형은 무엇입니까?일반적으로 객체 지향 프로그래밍에서?

공변량 반환 - 방법을 재정의할 때 재정의 방법의 반환 유형이 재정의된 방법의 반환 유형의 하위 유형이 될 수 있음을 의미합니다.

예를 들어 이를 명확히 하기 위해 일반적인 사례는 다음과 같습니다.Object.clone()- 타입의 반환을 선언합니다.Object자신의 클래스에서 다음과 같이 덮어쓸 수 있습니다.

public class MyFoo
{

   ...

   // Note covariant return here, method does not just return Object
   public MyFoo clone()
   {
       // Implementation
   }
}

여기서의 이점은 MyFoo 오브젝트에 대한 명시적 참조를 보유하는 모든 메서드가 호출할 수 있다는 것입니다.clone()(주조하지 않고) 수익률이 다음 중 하나의 인스턴스임을 알 수 있습니다.MyFoo공변 반환 유형이 없으면 MyFoo에서 오버라이드된 메서드가 반환되도록 선언해야 합니다.Object따라서 발신 코드는 메서드 호출의 결과를 명시적으로 다운캐스트해야 합니다(양쪽 모두 MyFoo의 인스턴스일 뿐이라는 것을 알고 있다고 해도).

에 대해서는 특별한 것은 없습니다.clone()또한 오버라이드된 방법은 공변량 리턴을 가질 수 있습니다.이 방법이 자주 도움이 되는 표준 방법이기 때문에 여기서 예로 사용했습니다.

다음으로 간단한 예를 제시하겠습니다.

Animal학급

public class Animal {

    protected Food seekFood() {

        return new Food();
    }
}

Dog학급

public class Dog extends Animal {

    @Override
    protected Food seekFood() {

        return new DogFood();
    }
}

반환 유형을 수정할 수 있습니다.DogseekFood()하는 방법DogFood- 서브클래스Food다음과 같이 합니다.

@Override
protected DogFood seekFood() {

    return new DogFood();
}

그건 완벽하게 법적 우선권이고, 반환 유형은DogseekFood()방법을 공변량 반환 유형이라고 합니다.

JDK 1.5 릴리즈부터 Java에서 공변형이 도입되었습니다.간단한 케이스로 설명하겠습니다.함수를 오버라이드하면 함수는 대부분의 책에서 읽을 수 있는 동작에 변경을 가할 수 있지만 {저자}님이 놓치고 있는 것은 반환형도 변경할 수 있다는 것입니다.자세한 내용은 아래 링크를 참조하십시오.메서드의 기본 버전에 할당될 수 있는 한 반환 유형을 변경할 수 있습니다.

따라서 파생된 유형을 반환하는 이 기능을 공변량이라고 합니다.

재정의된 메서드는 반환 유형이 다를 수 있습니까?

공변량 반환 유형은 단순히 자체 클래스 참조 또는 해당 자식 클래스 참조를 반환하는 것을 의미합니다.

class Parent {
 //it contain data member and data method
}

class Child extends Parent { 
//it contain data member and data method
 //covariant return
  public Parent methodName() {
     return new Parent();
          or 
     return Child();
  }

}

상기의 회답에 덧붙여, 오버라이드 메서드(서브 클래스 메서드)의 반환 타입은 오버라이드 메서드(슈퍼 클래스 메서드)의 반환 타입의 서브 클래스여야 한다는 제약이 있어, 공변수 반환 타입간에 오버라이드 할 수 있습니다.이는 Java 5 이후부터 유효합니다.

공변량 반환 유형은 반환 유형이 하위 클래스와 동일한 방향으로 변할 수 있음을 지정합니다.

class One{  
    One get(){return this;}  
}  

class Two extends One{  
  Two get(){return this;}  

void message(){
  System.out.println("After Java5 welcome to covariant return type");
}  

public static void main(String args[]){  
    new Two().get().message();  
}  
}

Java 5 이전에는 반환 유형을 변경하여 어떤 메서드도 덮어쓸 수 없었습니다.근데 이제 자바5부터

반환 유형이 Non-Primitive인 메서드를 서브 클래스가 덮어쓰지만 반환 유형이 서브 클래스 유형으로 변경되는 경우 반환 유형을 변경하여 메서드를 재정의할 수 있습니다.

  • 클래스 계층에 존재하는 혼동을 방지하여 코드를 판독, 사용 및 유지 관리할 수 있도록 합니다.
  • 하다, 우선하다, 우선하다, 보다 타입을 수 .
    ★★★★★★★★★★★★★★★★★★.

  • 반환 시 런타임 ClassCast 예외 방지 도움말

레퍼런스: www.geeksforgeeks.org

  • Java의 공변 반환 유형을 사용하면 재정의된 메서드의 반환 유형을 좁힐 수 있습니다.
  • 이 기능은 클라이언트 측의 다운캐스팅을 회피하는 데 도움이 됩니다.이를 통해 프로그래머는 유형 확인 및 다운 캐스팅 없이 프로그래밍할 수 있습니다.
  • 공변량 반환 유형은 항상 비원시 반환 유형에 대해서만 작동합니다.
interface Interviewer {
    default Object submitInterviewStatus() {
        System.out.println("Interviewer:Accept");
        return "Interviewer:Accept";
    }
}
class Manager implements Interviewer {
    @Override
    public String submitInterviewStatus() {
        System.out.println("Manager:Accept");
        return "Manager:Accept";
    }
}
class Project {
    public static void main(String args[]) {
        Interviewer interviewer = new Manager();
        interviewer.submitInterviewStatus();
        Manager mgr = new Manager();
        mgr.submitInterviewStatus();
    }
}

다른 예는 Java에서 가져온 것입니다.

UnaryOperator.java

@FunctionalInterface
public interface UnaryOperator<T> extends Function<T, T> {

    /**
     * Returns a unary operator that always returns its input argument.
     *
     * @param <T> the type of the input and output of the operator
     * @return a unary operator that always returns its input argument
     */
    static <T> UnaryOperator<T> identity() {
        return t -> t;
    }
}

Function.java

@FunctionalInterface
public interface Function<T, R> {

    ........
    ........
    ........
    ........

    static <T> Function<T, T> identity() {
        return t -> t;
    }
}

Java5 이전에는 반환 유형을 변경하여 메서드를 재정의할 수 없었습니다.그러나 Java5 이후로는 서브클래스가 Non-Primitive인 메서드를 덮어쓰지만 반환 타입을 서브클래스 타입으로 변경하는 경우 반환 타입을 변경하여 메서드를 덮어쓸 수 있습니다.

언급URL : https://stackoverflow.com/questions/1882584/what-is-a-covariant-return-type

반응형