55

私はインタビューでこの質問に遭遇し、解決策を思い付くことができませんでした。「+=」演算子はJavaで何をするのですか?に示すように、その逆も可能です。

質問は以下のようでした。

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

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

4 に答える 4

55

このコードを試してください

Object x = 1;
String y = "";

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

なぜこれが機能するのか完全にはわかりませんが、コンパイラは言います

演算子+=は、引数タイプオブジェクト、文字列に対して未定義です。

2行目toStringは、オブジェクトで呼び出されていると思います。

編集:

+=演算子は一般的なオブジェクトでは無意味なので、それは理にかなっています。私の例では、intをオブジェクトにキャストしましたが、それはxObject型であることにのみ依存します。

Object x = new Object();

ただし、がObjectの場合にのみ機能するxため、実際には、StringはObjectの直接のサブクラスであると思います。これは失敗しx + yます:

Foo x = new Foo();

私が試した他のタイプの場合。

于 2011-11-15T14:37:49.317 に答える
3

それは不可能。

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

于 2011-11-15T16:13:58.397 に答える
2
int  i = 5;
String s = "a";
System.out.println(i+=s);  //Error
System.out.println(i+s);   // No error

基本的に、任意のオブジェクト、または文字列以外のプリミティブと文字列の組み合わせに対して機能します。

どちらの会社だったのかな?:)

于 2011-11-16T18:27:57.243 に答える
1

これは必ずしもコンパイルエラーを引き起こすとは限りません

あなたがこのようなsmoethingをしているなら:

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

それはうまくいくでしょう

たとえあなたがそうしても

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

正しく動作します。

しかし、xとyを取る場合、次のような2つの異なるタイプの変数を使用します。

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

このような場合、コンパイルに失敗します。

*任意のint、floatなどをStringと連結することもできます。

于 2011-11-21T13:28:26.453 に答える