「そしてここからが最も興味深い部分です。型変換について説明します。変数は型を変更できませんが、型を変換できる場所があります。その場所は代入操作です

「異なる型の変数を相互に割り当てることができます。その際、(特定の型の) 1 つの変数の値が他の型の値に変換され、他の変数に割り当てられます。

「拡張原始変換と縮小原始変換の 2 つのタイプの変換を指摘できます。拡張は、物を小さなかごから大きなかごに移動するようなものです。手順は目立たず、痛みもありません。縮小は、大きなかごから物を取り出すことに似ています。」そうすると、十分なスペースがなく、何かを捨てなければならない場合があります。

「ここでは、「バスケット」サイズに従って分類されたタイプを示します。

型変換

「ちょっとコメントをいくつか。

1. charのバスケットは short のバスケットと同じサイズですが、物を一方からもう一方へ自由に移動することはできません。値をshortからcharに移動すると、0 未満の値は常に失われます。値を char から short に移動すると、32,000 を超える値は失われます。

2. 整数を小数に変換すると、数値の最下位桁が切り捨てられることがあります。ただし、分数の目的は近似値を保存することであるため、これは許容されます。」

"縮小変換を実行するときは、エラーが発生していないこと、つまり数値の一部を意図的に破棄していることをコンパイラに明示的に伝える必要があります。これを行うためにキャスト演算子 (つまり、括弧内の型名) を 使用ます

「さまざまな型の変数を割り当てる方法は次のとおりです。」

Javaコード 説明
byte a = 115;
int b = a;
拡大プリミティブ変換。 すべてが素晴らしいです。
int c = 10000;
byte d = (byte) c;
縮小プリミティブ変換余分なバイトは破棄する必要があることを明示的に示す必要があります。
int c = 10;
byte d = (byte) c;
ナロープリミティブ変換。余分なバイトは、0 に等しい場合でも破棄する必要があることを明示的に示す必要があります。
float f = 10000;
long l = (long) (f * f);
float f2 = l;
long l2 = (long) f2;
float に代入すると、拡張プリミティブ変換が行われます。 float を long に代入すると、縮小プリミティブ変換が行われます。キャスト演算子が必要です。
double d = 1;
float f = (float) d;
long l = (long) f;
int i = (int) l;
short s = (short) i;
byte b = (byte) s;
最初の行を除くすべての代入演算における縮小変換。これらの変換では、型変換を明示的に指定する必要があります。

"キャスト演算子は、数値の一部が破棄される場合、または縮小プリミティブ変換が発生する場合には必ず数値/変数の前に置く必要があります。キャスト演算子は、その直後の数値/変数にのみ影響します。"

Javaコード 説明
float f = 10000;
long l = (long) f * f;
2 つの変数のうち 1 つだけが Long にキャストされます。つまり、long と float の乗算は float と等しくなります。
float f = 10000;
long l = (long) (f * f);
式全体がlongにキャストされます。

"そうか。"