문제

이 질문은 다음의 후속 조치입니다.동일한 이름의 익명 클래스 이외의 방법을 호출 할 수없는 이유

이 이전 질문 답변 , 그러나 지금은 Javac인지 알고 싶습니다 ~해야 한다 런 (int bar)을 찾으시겠습니까? (실행 (42) 실패 이유를 확인하려면 이전 질문을 참조하십시오)

그렇지 않으면 사양 때문입니까? 모호한 코드를 생성합니까? 내 요점은 이것이 버그라고 생각합니다. 이전 질문은 왜이 코드가 컴파일에 실패하는지 설명했지만 Javac이 현재 레벨에서 일치를 찾지 못하면 트리에서 더 높이 검색되면 컴파일해야한다고 생각합니다. 즉. this.run ()이 일치하지 않으면 자동으로 적용 할 수없는 것을 확인해야합니다.

또한 Foo (int bar)가 올바르게 발견되었습니다. Run (int bar)을 찾을 수없는 이유가 있으면 Foo (int bar)가 발견되는 이유도 설명해야합니다.

public class NotApplicable {

    public NotApplicable() {
        new Runnable() {
            public void run() {

                // this works just fine, it automatically used NotApplicable.this when it couldn't find this.foo
                foo(42);

                // this fails to compile, javac find this.run(), and it does not match
                run(42);

                // to force javac to find run(int bar) you must use the following
                //NotApplicable.this.run(42);
            }
        };
    }

    private void run(int bar) {
    }

    public void foo(int bar) {
    }
}
도움이 되었습니까?

해결책

Javac 의이 동작은 사양을 준수합니다. 보다 §15.12 메소드 호출 표현식 자바 언어 사양, 특히 "Compile Time Step 1"아래의 단락에서 자격이없는 메소드 호출의 의미를 설명합니다.

식별자가 해당 이름을 가진 가시 메소드 선언의 범위 (§6.3) 내에 나타나면 해당 메소드가 멤버 인 유형 선언이 있어야합니다. T를 가장 안쪽으로 그러한 유형 선언으로합시다. 검색의 클래스 또는 인터페이스는 T입니다.

다시 말해, 자격이없는 방법 이름 이름이 발견 된 가장 내면의 "유형 선언"(클래스 또는 인터페이스 선언을 의미)에서 검색됩니다. ").

다른 팁

모호성과 취약성을위한 레시피처럼 들립니다. 기본 클래스에 새 방법이 추가 되 자마자 (좋아요, 인터페이스에 적합하지 않습니다 ...) 코드의 의미가 완전히 변경됩니다.

익명의 수업은 이미 꽤 못 생겼습니다.

노력하다

NotApplicable.this.run(42);

대신에.

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