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