Java での変換とプロモーション

Feb 22 2023
この記事では、プリミティブ変換について説明します。· 型変換 ∘ 暗黙的な型変換 ∘ 明示的な型変換 · 式における自動型昇格 · 型キャストと型強制の違い コンピューター サイエンスでは、型変換、型キャスト、型強制、および型ジャグリングは、式を 1 つの式から変更するさまざまな方法です。データ型を別のものに変更します。

この記事では、プリミティブ変換について説明します。

·型変換
∘
暗黙的な型変換
∘
明示的な型変換
·
式における自動型昇格
·
型キャストと型強制の違い

コンピューター サイエンスでは、型変換、型キャスト、型強制、および型ジャグリングは、あるデータ型から別のデータ型に式を変更するさまざまな方法です。例としては、整数値の浮動小数点値または文字列としてのテキスト表現への変換、またはその逆の変換が挙げられます。型変換では、型階層またはデータ表現の特定の機能を利用できます。型変換の 2 つの重要な側面は、型変換が暗黙的(自動的に)行われるか明示的に行われるかということと、基礎となるデータ表現がある表現から別の表現に変換されるか、または指定された表現が単に再解釈されるだけであるかどうかです。別のデータ型の表現として。一般に、プリミティブ データ型と複合データ型の両方を変換できます。

各プログラミング言語には、型の変換方法に関する独自のルールがあります。強い型付けを持つ言語は通常、暗黙的な変換をほとんど行わず、表現の再解釈を妨げますが、弱い型付けを持つ言語はデータ型間で多くの暗黙的な変換を実行します。弱い型付け言語では、コンパイラーがデータ項目を異なる表現を持つものとして任意に解釈することを強制できることがよくあります。これは、明白ではないプログラミング エラー、または基礎となるハードウェアを直接処理するための技術的方法である可能性があります。

Java は、boolean、char、int、unsigned int、signed int、float、double、long など、他の動的言語と同様にさまざまなデータ型を提供し、メモリに格納する際にすべてのデータ型が異なる領域を取得する合計 7 つの型を提供します。

型変換

以前のプログラミング経験がある場合は、ある型の値を別の型の変数に代入することが非常に一般的であることをすでにご存知でしょう。2 つの型に互換性がある場合、Java は自動的に変換(型変換)を実行します。たとえば、int 値を long 変数に代入することは常に可能です。ただし、すべての型に互換性があるわけではないため、すべての型変換が暗黙的に許可されるわけではありません。たとえば、double から byte への自動変換は定義されていません。幸いなことに、互換性のない型間で変換を行うことはまだ可能です。これを行うには、明示的なキャストを実行する Cast を使用する必要があります。互換性のない型間の変換。自動または拡大型変換 (型強制、型ジャグリング) と縮小または明示的変換 (型キャスト) の両方を見てみましょう。

ご覧のとおり、変数だけでなく数値に対してもキャストを実行できます。余分なキャストを導入できることに注意してください。たとえば、コンパイラは、必要に応じて自動的に int 値を long に昇格します。ただし、要点を主張したり、コードを明確にするために、余分なキャストを使用することは許可されています。他の状況では、コードをコンパイルするためだけにキャストが不可欠な場合もあります。

C および C++ では、型変換によって問題が発生する可能性があります。Java では、いわゆる絞り込み変換を実行するとき (つまり、より多くの情報を保持できるデータ型からあまり保持できないデータ型に変換するとき) を除いて、変換は安全です。情報を失うリスク。ここで、コンパイラはキャスト(型キャスト)の使用を強制し、事実上、「これは危険な行為になる可能性があります。とにかくそれを実行させたい場合は、変換を明示的に行う必要があります。」」拡張変換では、新しい型が古い型の情報を十分に保持して情報が失われることがないため、キャスト (明示的なキャスト) は必要ありません。Java では、キャストをまったく許可しないブール型を除き、任意のプリミティブ型を他のプリミティブ型に変換できます。クラス型ではキャストができません。一方を他方に変換するには、特別なメソッドが必要です。(…)

暗黙的な型変換

「自動または自動型変換」とも呼ばれます。

  • ユーザーからの外部トリガーなしで、コンパイラーが独自に実行します。
  • 通常、式内に複数のデータ型が存在する場合に発生します。このような状況では、データの損失を避けるために型変換 (型昇格) が行われます。
  • 変数のすべてのデータ型は、最大のデータ型を持つ変数のデータ型にアップグレードされます。
  • bool -> char -> short int -> int -> 
    
    unsigned int -> long -> unsigned -> 
    
    long long -> float -> double -> long double
    

  • 2 つのタイプには互換性があります。たとえば、数値などのデータ型は他の数値データ型と互換性がありますが、boolean、char、またはStringデータ型とは互換性がありません。Stringと同様に、Booleanデータ型と互換性がありません。
  • 宛先の型がソースの型よりも大きいです。

暗黙的な変換では情報が失われ、符号が失われる可能性があり (signed が暗黙的に unsigned に変換される場合)、オーバーフローが発生する可能性があります (long long が暗黙的に float に変換される場合)。

このタイプの変換を ceorcion 型と呼ぶこともあります。

Java では、あるタイプのオブジェクトを、同様の内容を持つ別のタイプの別のオブジェクトに変換するメカニズムは、強制として知られています。言い換えれば、強制とは、あるデータ型を別のデータ型に変換するプロセスであると言えます。より具体的には、暗黙的な変換は強制と呼ばれます。これは型強制とも呼ばれます。

ceorcion 型では、データ型はコンパイラ時にコンパイラによって別のデータ型に自動的に変換されます。ceorcion 型では、宛先データ型をソース データ型より小さくすることはできないため、拡張変換とも呼ばれます。もう 1 つ重要なことは、互換性のあるデータ型にのみ適用できるということです。

「Ceorcion」の例 –

int x=30;
float y;
y=x;  // y==30.000000.

Java は、実線または破線の矢印の方向にデータを自動的に強制します。例えば:

点線の矢印を横切る強制は許可されますが、精度が失われる可能性があります。これは、変換された値が開始値と等しくない可能性があることを意味します。例えば:

ステートメントが矢印の方向に逆らってデータを強制しようとすると、コンパイラはエラーを発生します。

Java での暗黙的な型キャストの例を見てみましょう。

ここでは、単純な代入演算子を使用してint値をlong値に変換し、最後にdouble値に変換します。

public class Main {
  public static void main(String[] args) {
    int a = 20;
    long b = a;     //implicit casting from int to long data type
    double c = b; 
    System.out.println(a);
    System.out.println(b);
    System.out.println(c);
  }
}  // implicit casting from long to double data type

20
20
20.0

言い換えれば、「型変換」は型を変更する一般的なプロセスを指しますが、型強制はより具体的には型の暗黙的な変換を指します。型強制はさらに、プログラマ制御型とコンパイラ制御型 (ジャグリングと呼ばれることもあります) の 2 種類に分類できます。

明示的な型変換

自動型変換は便利ですが、すべてのニーズを満たせるわけではありません。たとえば、int 値をバイト変数に割り当てたい場合はどうすればよいでしょうか。バイトは int より小さいため、この変換は自動的には実行されません。この種の変換は型キャストと呼ばれることもあり、ユーザー定義です。

このプロセスは、ターゲットの型に適合するように値を明示的に狭くするため、絞り込み型変換とも呼ばれます。

互換性のない 2 つの型の間で変換を作成するには、型キャストを使用する必要があります。キャストは単なる明示的な型変換です。

Java では、キャスト演算子()を使用してこれを行うことができます。

これは、括弧内の式の前に必要な型を明示的に定義することによって行われます。

この一般的な形式は次のとおりです。

(target-type) expression

ここで、target-type は、指定された値を変換する目的のタイプを指定します。たとえば、次のフラグメントはint をbyteにキャストします。整数値がbyteの範囲より大きい場合、バイト範囲のモジュロ (整数を で割った余り) が減らされます。

int a; 
byte b; // … 
b = (byte) a;

次のプログラムは、キャストを必要とするいくつかの型変換を示しています。

// Demonstrate casts.
class Conversion {
public static void main(String args[]) {
byte b;
int i = 257;
double d = 323.142;
System.out.println("\nConversion of int to byte.");
b = (byte) i;
System.out.println("i and b " + i + " " + b);
System.out.println("\nConversion of double to int.");
i = (int) d;
System.out.println("d and i " + d + " " + i);
System.out.println("\nConversion of double to byte.");
b = (byte) d;
System.out.println("d and b " + d + " " + b);
}
}

Conversion of int to byte. i and b 257 1 
Conversion of double to int. d and i 323.142 323 
Conversion of double to byte. d and b 323.142 67

Java での明示的なキャストの例を見てみましょう。

public class Main  {  
  public static void main(String args[])  {  
    double d = 57.17;  
    int i = (int)d;  // Explicit casting from long to int data type
    System.out.println(d);  
    System.out.println(i);  //fractional part lost
  }  
}

57.17
57
57

式における自動型昇格

Java プログラミングでは型の昇格が一般的であり、オートタイプの昇格を使用することでプリミティブ データ型で自動的に実現できます。これは、自動データ型プロモーションとも呼ばれます。

ご存知かもしれませんが、代入以外にも、特定の型変換が発生する可能性がある別の場所、それが式内です。

以下は、可能なタイプのプロモーションを図示したものです。

int より小さいプリミティブ データ型 (つまり、char、byte、または short) に対して数学的演算またはビット演算を実行すると、それらの値は演算を実行する前に int にプロモートされ、その結果が値は int 型になります。したがって、より小さい型に代入し直す場合は、キャストを使用する必要があります。(また、より小さい型に代入し直すため、情報が失われる可能性があります。) 一般に、式内の最大のデータ型が、その式の結果のサイズを決定します。float と double を乗算すると、結果は double になります。int と long を追加すると、結果は長くなります。

さらに理解するには:

以下を考慮してください。式では、中間値に必要な精度がいずれかのオペランドの範囲を超える場合があります。たとえば、次の式を調べてください。

byte a = 40;
byte b = 50;
byte c = 100;
int d = a * b / c;

自動プロモーションは便利ですが、混乱を招くコンパイル時エラーを引き起こす可能性があります。たとえば、次の一見正しいコードは問題を引き起こします。

byte b = 50;
b = b * 2; // Error! Cannot assign an int to a byte!

オーバーフローの結果を理解している場合は、次のような明示的なキャストを使用する必要があります。

byte b = 50;
b = (byte)(b * 2);

自動型昇格のルール

Java で式を実行して正しい結果を得るには、次の型昇格のルールに従う必要があります。

  • byte、short、およびchar型のすべての変数は、intに自動的に型変換される必要があります。
  • 演算に参加する変数が長い場合、演算結果も長いものでなければなりません。
  • 演算に参加する変数がfloatの場合、演算結果はfloatでなければなりません。

Java の数値プロモーション ルールを示す Java の例をいくつか見てみましょう。

1- オペランドの 1 つが double の場合。

public class PromotionExample {
 public static void main(String[] args) {
  int i = 30;
  double d = 2.5;
  double result = i * d;
  System.out.println("Result is- " + result);
 }
}
// output :
// Result is- 75.0

2- オペランドの 1 つが float の場合。

public class PromotionExample {
 public static void main(String[] args) {
  short s = 4;
  int i = 30;
  float f = 6.75f;
  float result = (s+i) * f;
  System.out.println("Result is- " + result);
 }
}
//output
// Result is- 229.5

3- オペランドの 1 つが float の場合に、結果を int に代入しようとします。

public class PromotionExample {
 public static void main(String[] args) {
  byte a= 100;
  byte b= 50;
  int i= 80;
  float f = 80;
  result = f/i *b; // line 6
 }
}

      
                
error line 6

以下に示す型キャストと型強制の違いを見てみましょう。

  1. 型キャストでは、プログラマがキャスト演算子を使用してデータ型を別のデータ型に変換します。一方、型強制では、データ型はコンパイラによって別のデータ型に変換されます。
  2. 型キャストは、互換性のあるデータ型だけでなく、互換性のないデータ型にも適用できます。一方、型強制は、互換性のあるデータ型にのみ適用できます。
  3. 型キャストでは、データ型を別のデータ型にキャストするためにキャスト演算子が必要です。一方、型強制では、キャスト演算子は必要ありません。
  4. 型キャスト (明示的な型変換) では、データ型を別のデータ型に変換するときに、変換先のデータ型がソース データ型よりも小さい可能性があります。一方、型強制 (単純な型変換) では、変換先のデータ型を変換することはできません。ソースデータ型よりも小さい。
  5. 型キャストはプログラマによるプログラム設計中に行われますが、型変換 (単純型変換) はコンパイル時に行われます。
  6. 型キャストは、宛先データ型がソース データ型よりも小さい可能性があるため、縮小変換とも呼ばれます。一方、型 強制(単純型変換) は、宛先データ型がソース データ型よりも小さくできないため、拡張変換とも呼ばれます。ソースのデータ型。
  7. 型キャストは、コーディングや競技プログラミングでよく使用されます。一方、型強制(単純な型変換) は、不正解を引き起こす可能性があるため、コーディングや競技プログラミングではあまり使用されません。
  8. 型キャストはより効率的で信頼性が高くなりますが、型強制(単純な型変換) は効率と信頼性が低くなります。

フォローして私たちの出版物をサポートしてください

以下の記事も参考にしてください。

注目すべき 2023 年の React JS トレンド クリック ジャッキングとその予防策 Splunk と SpringBoot の統合 パート 1 コーディング: 2 つの文字列が Javascript のアナグラムであるかどうかを確認する Java が地球上で最も愛されているプログラミング言語である理由 Java のメソッドを理解する JavaScript に関する 5 つの一般的な質問: Spark アーキテクチャの概要 25. 最大二分探索サブツリー (BST)