'+'연산자는 개체 및 문자열에 적용 할 수 없습니다


12

다음 코드 :

void someMethod(Object value)
{
    String suffix = getSuffix();
    if (suffix != null)
        value += suffix;

    [...]
}

JDK 8 (-source 1.6 사용)에서 오류없이 컴파일되지만 JDK 6에서 오류 메시지와 함께 실패합니다.

Operator '+' cannot be applied to java.lang.Object and java.lang.String

오류가 무엇인지 이해하지만 왜 JDK 8로 컴파일됩니까? 이것은 어디에나 문서화되어 있습니까?


값이 String 일 필요는 없습니다. value가 정수이면 문자열을 추가하는 것이 의미가 없습니다. Maybye 당신은 문자열로 값을 캐스팅하려고 할 수 있습니다
fedoraHacker

2
@fedoraHacker 표현식 value = value + suffix은 값의 유형에 관계없이 완전히 합법적입니다. 그래서 나도 value += suffix합법적이어야합니다.
Grodriguez

와, 나도 몰랐어 다른 객체의 요점은 데이터가 할 수있는 것과 할 수없는 것에 대한 규칙을 정의하는 것이라고 생각했습니다. 다른 데이터 유형과 객체를 갖는 요점은 유형이 한 가지 일을 수행하도록 책임을 분리하는 것이지만 잘 수행하는 것입니다. 나는 당신이 그런 데이터 유형을 혼합 할 수 있다고 당황했습니다. 그럼 당신이 뭔가 매일 :)과 가치 = 배우고 난 전혀 구문 이의를 제기 해달라고 그래서 값 + 접미사, 값 + = 접미사와 excact 동일합니다
fedoraHacker

1
예. 그러나 문자열 유형은 다소 특별합니다. 여기서 + 연산자는 "문자열 연결 연산자"입니다. 피연산자 중 하나만 문자열 인 경우 다른 피연산자는 식을 평가하기 전에 문자열로 변환됩니다. JLS의이 섹션을 참조하십시오 .
Grodriguez

아, 나는 문자열이 그것을 그렇게 변환했는지 몰랐다. 질문에 답변 한 후에도 답장을 보내 주셔서 감사합니다.
fedoraHacker

답변:


16

JLS 15.26.2. 복합 할당 연산자 상태 :

형태의 복합 대입 식을 E1 op= E2동등 E1 = (T) ((E1) op (E2))여기서 T의 타입 E1즉 제외 E1한번만 평가된다.

이 문장은 Java 6 에서 Java 14 와 동일하며 Java 가 시작된 이후로 변경되지 않았을 것입니다.

그래서 value += suffix같은value = (Object) (value + suffix)

Java 6 컴파일러는 해당 명령문을 컴파일하지 못했습니다.


2
JDK (javac) 버그. JLS에 대한 포인터에 감사드립니다. 어쨌든 나는 그것을 놓쳤습니다.
Grodriguez

3
15.18.1. String Concatenation Operator + 는 또한 동등한 명령문 value = (Object) (value + suffix)이 컴파일되어야 하는 이유를 설명하는 데 적합합니다 .
Dukeling
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.