2012-09-15 3 views
12

수퍼 클래스의 메서드를 재정의 할 때 Java는 반환 유형을 공변수로 허용합니다.Java의 반올림 매개 변수 유형이 무시할 수없는 이유는 무엇입니까?

반비례 매개 변수 유형이 대조적 인 이유는 무엇입니까 은 메서드 재정의시 허용되지 않습니까?

+4

가능한 복제본 [대체에 대한 매개 변수의 왜곡이 왜 없습니까?] (http://stackoverflow.com/questions/2995926/why-is-there-no-parameter-contra-variance-for-overriding) –

+0

감사합니다. 나는 이것을 보았지만 C++의 대답을 이해하는 데 어려움을 겪었습니다. 왜냐하면 저는 C++에 익숙하지 않았기 때문에 특별히 Java를 묻는 것이 더 쉬울 수도 있습니다. – Will

+0

링크 된 게시물을 읽었을 때이 기능의 이득이 증가 된 놀람 요소보다 중요하지 않다는 것을 이해합니다. 특정 구현을 위해 오버로드 된 메서드를 제공하는 것이 그리 어렵지 않습니다. 이 기능의 다른 유스 케이스가 무엇을 의미합니까? 클래스의 메소드를 직접 호출하는 것을 제외하고는? –

답변

15

overloading이기 때문에.

특히 반환 유형은 오버로드시 고려되지 않으므로 공변 될 수 있으므로 슈퍼 클래스 또는 인터페이스의 구현과 여전히 일치합니다. 매개 변수는 오버로드 될 때 고려됩니다. Number doSomethingWithNumber(Number value)과 비교했을 때 Number doSomethingWithNumber(Integer value)의 최적화를 사용하는 것이 좋습니다.

+0

contravariant 매개 변수를 가진다고 가정하면 여전히 재정의 할 수 있지만 우리가 마주 치게 될 문제는 무엇입니까? 내가 좋아하는 무언가를 찾고 있어요 : http://stackoverflow.com/a/2996901/715236, 그러나 슈퍼 클래스에서 여러 재정의하는 하위 클래스의 메서드에 대한 나쁜 것이라고 무엇입니까? – Will

+0

가장 큰 문제는 체인의 어딘가에 기본 유형 과부하가 주어질 때 과부하를 제공 할 수 없다는 것입니다. 조회가 단순한 등호에서 같거나 더 기본적인 서명으로 변경되어야 할 것이므로 다형 함수 호출로 혼란을 겪을 것입니다. 두 가지를 모두 가지고 있지만 더 구체적인 것을 호출해야한다면 무엇을해야합니까? 디자인 관점에서 볼 때 'A가 B를 확장하고 B가 C를 확장하지만'B가 링크에서 void f (Object o) 구현을 제공하면 'A'는 더 많은 것을 구현할 기회가 없습니다 특정 오버로드 된 메서드. 이것은 악몽 일 것입니다. – pickypg

+1

가장 중요하게 생각하는 것은 지연된 API가 내부적으로 적절한 메서드를 호출하는 데 사용되는 엄청나게 못생긴 코드입니다. void f (Object o) {if (o instanceof 정수) f ((정수) o); }'. 그러면 어떻게 작동하는지 물어봐야합니까? 오버 라이딩 동작을 허용하려면'Object' 매개 변수 메쏘드가'Integer' 매개 변수 메쏘드를 오버라이드 (override) 할 것이므로 위의 코드는'스택 오버플로 (overflow) 될 때까지 무한 재귀 루프를 일으킬 것입니다. Object' 메소드를 호출합니다. – pickypg