2

関数のオーバーロードに関しては、Javaが実行時に実行する関数をどのように決定するかを完全には理解していません。次のような単純なプログラムがあると仮定しましょう。

public class Test {

    public static int numberTest(short x, int y) {
        // ...
    }
    public static int numberTest(short x, short y) {
        // ...
    }

    public static void main(String[] args) {
        short number = (short) 5;
        System.out.println(numberTest(number, 3));
    }

}

私はこれをテストしました-そしてJavaは最初のnumberTest()関数を使用します。なんで?なぜそれは2番目のものを使用していないのですか、あるいはむしろ、なぜそれはコンパイラエラーを示していないのですか?

最初のパラメータはshort、大丈夫です。しかし、2番目のものは2つの機能を区別します。関数呼び出しはちょうどを使用する3ので、それは両方である可能性がありますね。また、型変換は必要ありません。または、「3」を使用するたびにJavaは型変換を適用しますintか?それは常にで始まりbyte、次にに変換されshortますintか?

4

2 に答える 2

6

最初のパラメータは短いです、わかりました。しかし、2番目のものは2つの機能を区別します。関数呼び出しは3つしか使用しないので、両方である可能性がありますね。

いいえ。Javaの整数リテラルは常にまたはintですlong。簡単な例として、このコードは次のとおりです。

static void foo(short x) {
}

...
foo(3);

次のようなエラーが発生します。

Test.java:3: error: method foo in class Test cannot be applied to given types;
        foo(3);
        ^
  required: short
  found: int
  reason: actual argument int cannot be converted to short by method invocation
  conversion
1 error

JLSのセクション3.10.1から:

整数リテラルは、ASCII文字のLまたはl(ell)が接尾辞として付いている場合、long型になります。それ以外の場合は、int型(§4.2.1)です。

于 2012-11-22T21:02:50.360 に答える
3

特に明記されていない限り、リテラル3は自動的に見なされます。詳細については、http: //docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.htmlintを参照してください。

于 2012-11-22T21:02:55.990 に答える