変換の規則について
通常、Apex では、あるデータ型を別のデータ型に変換する場合、明示的に行う必要があります。たとえば、Integer データ型の変数を暗黙的に String に変換することはできません。string.format メソッドを使用する必要があります。ただし、一部のデータ型はメソッドを使用せず暗黙的に変換できます。
Number はデータ型の階層です。下位の数値型の変数は常に、明示的に変換せずに、より高位のデータ型に割り当てることができます。次に示すのは数値の階層です (下位から上位の順)。
- Integer
- Long
- Double
- Decimal
この階層と暗黙的な変換は、Java の数値階層とは異なります。Java の数値階層では基本のインターフェース数値が使用され、オブジェクトの暗黙的変換は行われません。
数値の他にも、暗黙的に変換できるデータ型があります。以下の規則が適用されます。
- ID は常に String に割り当てることができる。
- String を ID に割り当てることができる。ただし、実行時、値が正当な ID であることを確認します。正当でない場合、実行時例外が発生します。
- いつでも instanceOf キーワードを使用して文字列が ID かどうかをテストできる。
データ型に関するその他の考慮事項
- 数値のデータ型
- 数値は、Long の L または Double または Decimal の .0 が追加されていない限り、Integer 値です。たとえば、式 Long d = 123; は、d という Long 型の変数を宣言し、Integer 型の数値 (123) に割り当てて明示的に Long 型に変換されます。右側の Integer 型の値は、Integer の範囲内にあるため割り当てに成功しますが、右側の数値が Integer 型の最大値を超える場合、コンパイルエラーが発生します。この場合、数値に L を追加することによって、より範囲の広い Long 型の値にします。これは Long d = 2147483648L; のように表します。
- データ型の値のオーバーフロー
- 現在の型の最大値よりも大きな値を生成する演算をオーバーフローと言います。たとえば、Integer i = 2147483647 + 1; では、2147483647 が Integer の最大値であり、それに 1 を加算したことで Integer の負の最小値 –2147483648 に戻されてしまうため、値 –2147483648 となります。
- 演算によって現在の型の最大値よりも大きな結果が生成される場合、最大値を超える計算値がオーバーフローしてしまうため、最終結果は不正な値となります。たとえば、式 Long MillsPerYear = 365 * 24 * 60 * 60 * 1000; は、右側の Integer の生成値が最大値を超えてオーバーフローするため、不正な結果となります。そのため、最終的な値は予想されたものと異なります。これは、演算に使用している数値または変数の型が結果を保持するのに十分な大きさであるように指定することで回避できます。この例では、数値に L を追加して Long 型にすることによって、中間の結果が Long 型でありオーバーフローが起こらないようにしています。次の例では、Long 型の数値を乗算することによって、1 年あたりのミリ秒を正しく計算する方法を示します。
1Long MillsPerYear = 365L * 24L * 60L * 60L * 1000L; 2Long ExpectedValue = 31536000000L; 3System.assertEquals(MillsPerYear, ExpectedValue); - 除算における端数の消失
- Integer または Long 型の数値を除算するとき、結果の端数が発生した場合、それは Double 型や Decimal 型への暗黙的な変換を実行する前に除外されてしまいます。たとえば、Double d = 5/3; は、実際の結果 (1.666...) が Integer 型であり、暗黙的に Double 型に変換される前に 1 に丸められるため、1.0 を返します。端数の値を維持するには、除算で Double 型または Decimal 型の数値を使用する必要があります。たとえば、Double d = 5.0/3.0; は、5.0 と 3.0 が Double 型の値であるため 1.6666666666666667 を返します。指数が Double 型である結果を生み出すため、端数の値が除外されません。