4
public class Test {
static void test(Integer x) {
    System.out.println("Integer");
}

static void test(long x) {
    System.out.println("long");
}

static void test(Byte x) {
    System.out.println("byte");
}

static void test(Short x) {
    System.out.println("short");
}

public static void main(String[] args) {
    int i = 5;
    test(i);
}
}

出力値は「long」です。

Javaではint値を自動ボックス化する必要があるため、「整数」ではない理由を教えてくれるだけです。

4

2 に答える 2

14

コンパイラーが、をに拡張するか、をボックス化するかを選択できる場合、コンパイラーはint最もlong安価intInteger変換を選択します。つまり、に拡張しlongます。メソッド呼び出しのコンテキストでの変換のルールは、Java言語仕様のセクション5.3で説明されており、一致する可能性のあるものがいくつかある場合の一致メソッドの選択のルールは、セクション15.12.2(具体的にはセクション15.12.2.5ですが、これは非常に密度の高い読み取りであると警告しました)。

于 2013-02-07T20:22:33.150 に答える
0

これらはinteger、Javaのプリミティブ整数型ではないテストメソッドのクラスのインスタンスのみを受け入れます。クラスのようなIntegerプリミティブ型ではなく、Javaのクラスです。一方、プリミティブ型であり、のサブセットがあるため、最も近いものであるため、そのパラメーターを選択しました。doubleパラメータを使用することもできます。intまたはlongがメソッドパラメータに署名がない場合、最も近いものであるため、'sを使用することを選択しました。intStringlongintdouble

http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Integer.html

これを試して:

public static void main(String[] args) {
    int i = 5;
    test(i);

    Integer smartInt= new Integer(5);
    test(smartInt); 
}
于 2013-02-07T20:27:55.823 に答える