문제

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 - 따라서 호출 코드는 메소드 호출의 결과를 명시 적으로 다운 캐스트해야합니다 (양측도 "알고있는"이라고 생각했습니다.

특별한 것은 없습니다 clone() 그리고 재정의 된 방법은 공분산 반환을 가질 수 있습니다. 나는 이것이 종종 유용한 표준 방법이기 때문에 여기서 예제로 사용했습니다.

다른 팁

다음은 또 다른 간단한 예입니다.

Animal 수업

public class Animal {

    protected Food seekFood() {

        return new Food();
    }
}

Dog 수업

public class Dog extends Animal {

    @Override
    protected Food seekFood() {

        return new DogFood();
    }
}

반환 유형을 수정할 수 있습니다. Dog'에스 seekFood() 방법 DogFood - 서브 클래스 Food, 아래 그림과 같이:

@Override
protected DogFood seekFood() {

    return new DogFood();
}

그것은 완벽하게 법적 우발이며 반환 유형의 Dog'에스 seekFood() 방법은 다음과 같습니다 공분산 반환 유형.

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

}

공분산 반환 유형은 반환 유형이 서브 클래스와 동일한 방향으로 다를 수 있음을 지정합니다.

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 이전에는 리턴 유형을 변경하여 메소드를 무시할 수 없었습니다. 그러나 이제 Java5 이후로

서브 클래스가 반환 유형이 비 프리미티브 인 모든 메소드를 무시하지만 반환 유형을 서브 클래스 유형으로 변경하는 경우 리턴 유형을 변경하여 메소드를 무시할 수 있습니다.

  • 클래스 계층에 존재하는 혼란스러운 유형 캐스트를 피하고 코드를 읽을 수 있고 사용 가능하며 유지 관리 할 수 ​​있도록하는 데 도움이됩니다.
  • 재정의할 때 더 구체적인 반환 유형을 자유롭게 가질 수 있습니다.
    행동 양식.

  • 반품 시 런타임 ClassCastException을 방지하는 데 도움이 됩니다.

참조: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이므로 서브 클래스가 반환 유형이 비 프리미티브 인 모든 메소드를 재정의하지만 반환 유형을 서브 클래스 유형으로 변경하는 경우 리턴 유형을 변경하여 메소드를 무시할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top