20
static void method(short x)
{
   //do some stuff
}

main次の行を使用してメソッドから上記のメソッドを呼び出したとき。

method(1); // compilation failed

パラメータ 'x' は short であると予想され、int を渡しているため、上記の呼び出しが無効であることはわかっています。

上記の概念をさらにテストし、別の方法をコーディングしました。

static short method()
{
    //do some stuff
    return 1;    
}

ただし、上記のメソッドは正常に機能し、戻り値の型が短く、int を返しています。2 番目のメソッドがコンパイルされるのはなぜですか?

4

3 に答える 3

29

returnステートメント (JLS 14.17)は、割り当て変換 (JLS 5.2)を使用して、元の式の型から戻り値の型に変換できます。

代入変換には、ターゲット型の範囲内にある場合、定数式をより狭い型に変換する機能が含まれています。したがって、型の定数式は、値が の範囲内にあるときにintに変換できます。shortshort

メソッド引数は代入変換を経ません。メソッド呼び出し変換 (JLS 5.3)のみを使用し、この定数変換は含まれません。

なぜこれが起こるのかという点では、物事を簡単に推論できるようにするだけだと思います. 代入変換には常に単一のターゲット型がありますが、メソッド引数の場合、考慮すべきさまざまなオーバーロードが存在する可能性があるため、定数式の変換がどの程度具体的であるかを判断するには、より多くの規則が必要になります。ただし、これは推測にすぎません。明らかに実行できる可能性があります。(たとえば、C# ではこれが可能です。)

于 2013-05-27T09:08:57.253 に答える
0

-32,768の範囲内の数値と最大32,767で問題はないはず です。

実際には、メモリの節約が実際に重要な状況では、 short大きな配列でメモリを節約するために a を使用できます。

比較すると、intデータ型は 32 ビットの符号付き 2 の補数整数です。最小値は-2,147,483,648で、最大値は2,147,483,647 です。整数値の場合、他のものを選択する理由(メモリの節約など)がない限り、通常、このデータ型がデフォルトの選択です。このデータ型は、プログラムが使用する数値に対して十分な大きさである可能性が高いですが、より広い範囲の値が必要な場合は、long代わりに使用してください。

于 2013-05-27T12:52:58.740 に答える