5
class Test{
    public static void main(String[] args){
        int a = 1;
        int b = 5;

        Integer c = new Integer(1);
        Integer d = 5; //autoboxing at work

        System.out.println(c.compareTo(d));
        System.out.println(a.compareTo(b));
    }
}

( )がa.compareTo(b)コンパイルされないのはなぜですか? int cannot be dereferencedオブジェクトが必要なのはわかっていますが、必要に応じてオートボクシングが自動的にancompareToを作成すると思いました。この場合、オートボクシングが発生しないのはなぜですか? そして、それが起こらない他のケースは何ですか?intInteger

4

1 に答える 1

4

Autoboxing に関する Oracle チュートリアルから、ボックス化が発生する 2 つのケースは、プリミティブが次の場合です。

  • 対応するラッパー クラスのオブジェクトを期待するメソッドにパラメータとして渡されます。
  • 対応するラッパー クラスの変数に割り当てられます。

あなたの例で評価されている式 ( a.compareTo(d)) は、これらのシナリオのいずれにも当てはまりません。

autoboxing の JCP 提案には興味深い追加情報がいくつかあり、代入変換、メソッド呼び出し変換、およびキャスト変換のメカニズムとルールが説明されています。

于 2013-02-22T03:58:16.950 に答える