공변량 반환 유형이란 무엇입니까?
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();
}
}
반환 유형을 수정할 수 있습니다.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();
}
}
상기의 회답에 덧붙여, 오버라이드 메서드(서브 클래스 메서드)의 반환 타입은 오버라이드 메서드(슈퍼 클래스 메서드)의 반환 타입의 서브 클래스여야 한다는 제약이 있어, 공변수 반환 타입간에 오버라이드 할 수 있습니다.이는 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
'programing' 카테고리의 다른 글
JsonParseException : 따옴표가 없는 잘못된 문자(CTRL-CHAR, 코드 10) (0) | 2022.09.03 |
---|---|
일부 클래스에 Eclipse Java 패키지 탐색기가 물음표를 표시하는 이유는 무엇입니까? (0) | 2022.09.03 |
Kotlin의 클래스와 객체의 차이 (0) | 2022.09.03 |
포맷하지 않고 자바독에서 "<"와 ">"를 사용하려면 어떻게 해야 합니까? (0) | 2022.09.03 |
짧은 값 Java 설정 (0) | 2022.09.03 |