0

疑問があり、以下のコードでオブジェクトを削除するためにJREがどのクラスメソッドを使用したのか知りたいです。removeには、remove(int)とremove(Object)の2つの署名があるためです。AutoBoxing機能の一部として、ここでintは、コレクションに追加するときに整数と見なされます。このシナリオでは、どの削除メソッドがより高い優先順位を受け取りますか、またその理由は何ですか?理由を教えてください。

    Vector v=new Vector();
    for(int i=0;i<10;i++)
    {
        v.add(i);           
    }       
    v.remove(5); 
    System.err.println(v);

よろしくSudhakarChavali

4

3 に答える 3

3

クラスIntegerのインスタンスを作成しなくても、引数はintであり、Vectorのメソッドはオートボクシングなしで直接処理できます。コンパイラは、Java言語仕様で詳しく説明されている最も簡単な方法を使用します。

このバージョンでは、明示的に整数であるため、2番目の整数(インデックス= 1)が削除されます。

import java.util.Vector;

public class VectorAutoBox {
    public static void main(String[] args) {
        Vector vector = new Vector();
        vector.add(1);
        vector.add(5);
        vector.add(2);
        vector.add(3);
        vector.add(4);
        vector.add(6);
        System.out.println(vector);
        vector.remove( new Integer( 5 )); // case 1
//      vector.remove( 5 );               // case 2
        System.out.println(vector);
    }
}

ケース1の出力:

[1, 5, 2, 3, 4, 6]
[1, 2, 3, 4, 6]      value '5' at index 1 removed

ケース2の出力:

[1, 5, 2, 3, 4, 6]
[1, 5, 2, 3, 4]      value '6' at index 5 removed
于 2013-02-20T20:35:28.750 に答える
3

インデックス 1 をピックアップ

package com.jigar.stackoverflow.question.java;

public class VectorAutoBox {
    public static void main(String[] args) {
        Vector vector = new Vector();
        vector.add(1);
        vector.add(5);
        vector.add(2);
        vector.add(3);
        vector.add(4);
        vector.add(6);
        System.out.println(vector);
        vector.remove(5);
        System.out.println(vector);
    }
}

出力

[1, 5, 2, 3, 4, 6]
[1, 5, 2, 3, 4]
于 2013-02-20T20:30:30.517 に答える
3

適用可能なメソッドを決定するためのルールは、JLS #15.12.2で詳しく説明されています。実際には、ボックス化/ボックス化解除を必要としないメソッドは、ボックス化/ボックス化解除操作を必要とするメソッドよりも優先されます。

  • 最初のフェーズ (§15.12.2.2) では、ボックス化またはボックス化解除の変換、または可変アリティ メソッド呼び出しの使用を許可せずに、オーバーロードの解決を実行します。このフェーズで適用可能なメソッドが見つからない場合、処理は 2 番目のフェーズに進みます。
  • 2 番目のフェーズ (§15.12.2.3) では、ボックス化とボックス化解除を許可しながらオーバーロードの解決を実行しますが、可変アリティ メソッドの呼び出しは引き続き使用できません。

と書くとSoremove(int)が呼び出されますremove(5);

Vector はほとんどの目的で廃止されていることに注意してください。

于 2013-02-20T20:38:20.647 に答える