2014-07-07 8 views
17

주 메서드는 var에 액세스하려고 시도하지만 모호한 호출을 발생시킵니다. 왜? Base1의 인스턴스 변수 var는 정적 컨텍스트에서 액세스 할 수 없습니다 (표시 할 수 없음).Java의 정적 컨텍스트에서 모호한 호출

class Base1 { 
     int var; 
    } 

    interface Base2 { 
     public static final int var = 0; 
    } 

    class Test extends Base1 implements Base2 { 
     public static void main(String args[]) { 
      System.out.println("var:" + var); 
     } 
    } 
+0

@Pablo, 패키지는 중요하지 않습니다. 코드 스 니펫을 하나의 파일에 넣고 결과를 확인하십시오. – AlexR

+1

@AlexR "오류 - 하나 이상의 공용 클래스가 기본 파일에 필요합니다." – Unihedron

+0

음, 클래스 중 하나를 공개로 설정하십시오. 이것은 문제가 아닙니다. – AlexR

답변

17

JLS rule for field access ambiguity

경우 유형의 식별자 이름 여러 접근 (§6.6) 멤버 필드 T이면 필드 액세스가 모호하며 컴파일시 오류 이 발생합니다. 유형 인 경우에만

그리고 on the subject of accessibility

구성원 참조 타입 (클래스, 인터페이스, 필드 또는 메소드) 또는 클래스 타입의 생성자, 액세스 접근

static 컨텍스트에서 인스턴스 필드 액세스로 인해 컴파일 오류가 발생하는지 여부는 구분되지 않습니다. 당신이

public static void main(String args[]) { 
    Test test = new Test(); 
    System.out.println("var:" + test.var); 
} 

당신은 여전히 ​​모호함이있을 것이다 있었다 수

참고.

3

것은 명확한 자격 접두사로 인터페이스 이름을 넣어 만들려면 :

class Test extends Base1 implements Base2 { 

     public static void main(String args[]) { 
      System.out.println("var:" + Base2.var); 
     } 
} 
+3

포스터가 이유를 묻는 것 같아요. 해결 방법이 아닙니다. – mxb

+0

때로는 컴파일러가 예상대로 지능적으로 작동하지 않는 경우가 있습니다. 코드의 autor가 비 정적 필드 인'Base2.var'를 의미 할 수도 있습니다.이 경우에는 모호합니다. (다른 한편으로는, 인간의 두뇌가 이해할 수있는 용량이 필요하기 때문에 비 연속적인 코드를 작성하는 편이 낫습니다. 컴파일러가 이해하는 것보다 바보가 이해할 수있는 코드를 작성하십시오. :) –

1

초기 단계에서 컴파일러는 확장하는 클래스의 변수 var와 구현 한 인터페이스를 찾습니다. 2 단계에서 두 위치의 변수를 찾았으므로 모호성을 보입니다.

1

정적 및 비 정적 컨텍스트에서 배제하지 않는 변수는 ... 액세스 수정 실제로이 규칙들입니다

를 액세스 할 수 있도록 허용하는 방법을

변화 var에 대한 액세스 한정자에 Base1 to private과 같은 모호성이 사라집니다. 그러나이 방법은 모양을 지정하는 것이 아니지만 액세스 수정 자들은 실제로 정적 정적 컨텍스트가 아닌 인스턴스 변수에 대한 참조를 지정합니다.

class Base1 { 
    private int var; 
    //static int var=5; 
} 

interface Base2 { 
    public static final int var = 0; 
} 

class ambiguousNonStaticCall extends Base1 implements Base2 { 
    public static void main(String args[]) { 
     System.out.println("var:" + var); 
    } 
} 

위의 코드는 정상적으로 컴파일됩니다.