Program Tip

x + = y는 컴파일 오류를 제공하고 x = x + y는 제공하지 않도록 x와 y를 어떻게 선언합니까?

programtip 2021. 1. 8. 22:10
반응형

x + = y는 컴파일 오류를 제공하고 x = x + y는 제공하지 않도록 x와 y를 어떻게 선언합니까?


나는 인터뷰에서이 질문을 만났지만 해결책을 찾지 못했습니다. Java에서 "+ ="연산자는 무엇을합니까?에 표시된대로 그 반대로 수행 할 수 있다는 것을 알고 있습니다 .

그래서 질문은 아래와 같았습니다.

..... x = .....;
..... y = .....;

x += y; //compile error
x = x + y; //works properly

이 코드 시도

Object x = 1;
String y = "";

x += y; //compile error
x = x + y; //works properly

이것이 왜 작동하는지 완전히 확실하지 않지만 컴파일러는

+ = 연산자는 인수 유형 개체, 문자열에 대해 정의되지 않았습니다.

두 번째 줄 toString에 대해 Object에서 호출 되었다고 가정합니다 .

편집하다:

+=연산자는 일반 객체에서 의미가 없기 때문에 의미 가 있습니다. 내 예제에서는 int를 Object로 캐스트하지만 xObject 유형 에만 의존합니다 .

Object x = new Object();

x그래도 Object 인 경우에만 작동 하므로 실제로 String이 Object의 직접 하위 클래스라고 생각합니다. 다음의 경우 실패합니다 x + y.

Foo x = new Foo();

내가 시도한 다른 유형에 대해.


불가능합니다.

X x = ...;
Y y = ...;

x += y;         //1
//equivalent to
x = (X) (x+y);  //2

x = x+y;        //3

의 유형 x+y이 Z 라고 가정합니다 . # 2에는 Z에서 X 로의 캐스팅 변환이 필요합니다. # 3은 Z에서 X 로의 할당 변환이 필요합니다. "캐스팅 변환은 할당 변환보다 더 포괄적입니다"(1). 따라서 # 3이 합법적 인 한 # 2는 합법적이며 # 1은 합법적입니다.

반대로 # 1은 합법적이지만 # 3은 불법 일 수 있습니다.

    byte x = 0;
    int y  = 1;
    x+=y;     // ok, x=(byte)(x+y), cast int to byte is allowed.
    x = x+y;  // error, assign int to byte

이 정보는 전혀 유용하지 않습니다. 이것은 놀라운 차이를 만드는 Java의 결함입니다.

(1) http://java.sun.com/docs/books/jls/third_edition/html/conversions.html#5.5


int  i = 5;
String s = "a";
System.out.println(i+=s);  //Error
System.out.println(i+s);   // No error

Basically, works for Any object or any non-string primitive and String combination.

I wonder which company it was? :)


This thing will not always give you compilation error

If you are doing smoething like this :

class A{
public static void main(String args[]){
    String x = "10";
    String y = "s";
    x += y;
    System.out.println(x);
}
}

It will work fine

even if you do

class A{
public static void main(String args[]){
    int x = 10;
    float y = 11.5F;
    x += y;
    System.out.println(x);
}
}

it will work properly.

But if you take x and y two different type of variables like :

class X{
 }
class A{
public static void main(String args[]){
    X x = new X();
    float y = 11.5F;
    x += y;
    System.out.println(x);
}
}

In such cases it will fail to compile.

*Even you can concatinate any int, float etc with String.

ReferenceURL : https://stackoverflow.com/questions/8137732/how-do-you-declare-x-and-y-so-that-x-y-gives-a-compilation-error-and-x-xy-not

반응형