[java] Java에서 다른 반환 유형으로 오버로드?

반환 유형을 변경하여 함수를 오버로드 할 수없는 이유는 무엇입니까? Java의 차기 버전에서 변경됩니까?

참고로 C ++에서 가능합니까?



답변

자바에서는 할 수없고 C ++에서는 할 수 없습니다. 이유는 컴파일러가 호출 할 함수를 파악하는 데 반환 값만으로는 충분하지 않기 때문입니다.

public int foo() {...}
public float foo() {..}

...
foo(); // which one?


답변

그 이유는 Java의 오버로드는 서명 이 다른 메소드에만 허용되기 때문입니다 .

반환 형식은 메서드 서명의 일부가 아니므로 오버로드를 구분하는 데 사용할 수 없습니다.

Java 자습서에서 메서드 정의를 참조하십시오 .


답변

Java 5.0 이전에는 메서드를 재정의 할 때 매개 변수와 반환 유형이 모두 정확히 일치해야합니다. Java 5.0에서는 공변 반환 유형이라는 새로운 기능을 도입했습니다. 동일한 서명으로 메서드를 재정의 할 수 있지만 반환 된 객체의 하위 클래스를 반환합니다. 즉, 서브 클래스의 메소드는 수퍼 클래스에서 동일한 시그니처를 사용하여 메소드가 리턴 한 유형의 서브 클래스 인 객체를 반환 할 수 있습니다.


답변

Overloaded Java의 메소드는 인수도 다르기 때문에 다른 반환 유형을 가질 수 있습니다.

샘플 코드를 확인하세요.

public class B {

    public String greet() {
        return "Hello";
    }

    //This will work
    public StringBuilder greet(String name) {
        return new StringBuilder("Hello " + name);
    }

    //This will not work
    //Error: Duplicate method greet() in type B
    public StringBuilder greet() {
        return new StringBuilder("Hello Tarzan");
    }

}


답변

컴파일러는 메서드를 구분할 때 반환 형식을 고려하지 않으므로 반환 형식이 다른 경우에도 동일한 서명으로 두 메서드를 선언 할 수 없습니다.


답변

메서드를 오버로드하는 동안 반환 유형은 중요하지 않습니다. 모호함이 없는지 확인하기 만하면됩니다!

Java가 호출 할 메소드를 알 수있는 유일한 방법은 인수 목록의 유형을 구별하는 것입니다. 컴파일러가 동일한 이름과 동일한 인수 유형을 가진 두 개의 메서드를 허용하면 어떤 메서드를 호출해야하는지 결정할 방법이 없습니다.


답변

컴파일러는 메서드를 구분할 때 반환 형식을 고려하지 않으므로 반환 형식이 다른 경우에도 동일한 서명으로 두 메서드를 선언 할 수 없습니다.

함수 실행을 알고 있다면 함수를 호출 할 때 정의 부분이 실행되고 마침내 return 문이 필요하다는 것을 알게 될 것입니다. 따라서 함수의 전체 정의 뒤에 return이 온다고 말할 수 있습니다. 동일한 이름과 동일한 유형 및 아니오를 가진 더 많은 기능. 함수 이름과 매개 변수가 동일하기 때문에 컴파일러가 호출 할 인수를 어떻게 알 수 있는지 호출 할 때 인수의 수입니다. 처음 호출 할 때 모든 초점은 인수와 함수 이름에 있으며 함수 정의가 완료된 후 마침내 return 문을 처리합니다.

컴파일 시간 오류는 런타임 오류보다 낫습니다. 따라서 Java 컴파일러는 동일한 매개 변수를 가진 동일한 메서드를 선언하면 컴파일러 시간 오류를 렌더링합니다.