2013-05-07 2 views
2
public class Ambiguity { 
    public static void main(String[] args) { 
     int Integer = 3; 
     System.out.println((Integer) null);  // cast; prints "null" 
     System.out.println((Integer) - Integer); // subtraction; prints "0" 
     System.out.println((Integer) (-Integer)); // cast; prints "-3" 
    } 
} 

자바에서는 정수라는 변수를 선언 한 다음 Integer 클래스 또는 Integer 변수가 포함 된 식으로 캐스팅 될 수있는 코드를 작성할 수 있습니다. Java는 클래스 이름과 변수 이름 사이의 모호성을 어떻게 해결합니까? 스펙 어딘가에 형식 규칙이 있습니까? 그것은 ad-hoc 발견 적 것입니까? 나는 C 컴파일러가 비슷한 문제를 다루어야한다는 것을 알고 있으며, 나는 how they deal with it을 알고 있지만 자바는 더 관대하다고 생각한다.자바 문법의 모호성

+0

자세한 내용을 공유 할 수 있습니까? Autoboxing에 대해 읽었습니까? – Geek

+0

코드 –

+0

을 게시해야했지만 사이트에서 허용하지 않았습니다. 편집에서 다시 시도하겠습니다. 편집 : 좋아, 거기에 코드 샘플이 있습니다. – user2357112

답변

-1

모호성이 없으며 컴파일러는 항상 클래스 또는 변수를 기대하며 둘 다 적합 할 수는 없습니다. 예 : 의 할당은에서

Integer Integer = 1; 
    Integer = new Integer(1); 
    Integer = Integer + 1; 

1)은 항상 어떤 클래스 이름

+2

'(Integer) -Integer'는 컴파일러가 첫 번째 Integer를 클래스 또는 변수로 해석 할 수있는 것처럼 보입니다. – user2357112

+0

왜? Double을 넣어보십시오. (Double) - ... 잘못된 구문 –

2
을 할 수없는 경우에만 연산의 클래스

3)에 새를 호출 할 수 있습니다)/변수 이름 쌍

2가 입력된다

JLS for evaluation order

"Java 프로그래밍 언어는 연산자의 피연산자가 특정 평가 순서, 즉 왼쪽에서 오른쪽으로 평가됩니다. " 피연산자로 (Integer)Integer와 빼기 연산자가 그 명확한 것을이 구문 분석 이제

(Integer) -Integer 

. 왼쪽에서 시작하여 괄호 표현식은 값으로 평가되어야하며 (따라서 후속 by 및 연산자) 따라서 Type이 아니라 변수로 간주됩니다. 이 파싱되면

(Integer) (-Integer) 

은 어떤 오퍼레이터 따라서 (식 값 또는 유형인지) 모호성없이 두 토큰 (괄호 내의 각) 있다. 첫 번째 괄호는 항상 Type이고 그 뒤의 expression은 항상 캐스팅 할 값으로 평가됩니다.

+0

아마도 제 질문을 다시 말해야합니다. 나는 클래스와 같은 변수를 명명해도 변수를 만들지 않으며 클래스는 서로 관계가 없다는 것을 알고 있습니다. 내 질문은 동일한 이름의 클래스 및 변수로 인해 파싱 모호성에 대한 것입니다. 특히 컴파일러는'(Integer) -Integer'가 뺄셈이고'(Integer) (-Integer)'가 캐스트라고 어떻게 결정합니까? – user2357112

+0

제 편집을 참조하십시오. – Santosh

0

내가 아는 한 파서는 오른쪽에서 왼쪽으로 이동합니다. 첫 번째 진술은 분명합니다.

두 번째 구문에서 구문 분석기는 변수를 찾은 다음 다른 변수를 제외하고 표현식 "-"을 찾았지만 오른쪽 괄호를 찾습니다. 즉, 괄호 안의 식을 먼저 구문 분석해야합니다. 귀하의 예에서는 변수 만 있습니다. 그래서 파서는 값을 받아 다른 변수와 함께 subtrakt합니다.

세 번째 문장에서 파서는 먼저 오른쪽 괄호 =>를 찾습니다. 그러면 그가 어떤 연산 (+, *,/- - 예)을 찾지 못한 후에 브라켓 (-3) 내의 표현식을 구문 분석합니다. 다음 브라켓은 이것이 출연진임을 의미합니다.