リファクタリングせずに、すべての float を double (またはその逆) に置き換えるために、いくつかの構造を使用することは可能ですか?
たとえば、float や double と完全に互換性のある数学システムを実装している場合があります。C では、:typedef float real
を使用real
してから、コードで使用できます。double に変更するには、1 行のコードを置き換えるだけです。
Javaでこのようなことは可能ですか? それとも、一般的な数値型がありますか?
これは、あなたが説明した単純なケースでは Java では不可能です。ただし、コードの動作方法によっては、数学クラスをインターフェイスに記述し、値を返すすべてのメソッドを double と float の両方の戻り値の型で実装することができます。次に、2 つの実装クラスを作成し、どちらを使用するかに応じてそれらを切り替えることができます。
これはやり過ぎのようです。なぜこれをしたいのですか?
実際には、float/double の代わりに BigDecimal を使用することをお勧めします。java に typedef float real に似たものがあるとは思わないでください
いいえ、Java でプリミティブ型を使用してこれを実現する方法はありません。typedef に相当するものはまったくなく、テンプレート クラスもありません。機能的な観点からは、オブジェクト指向の方法でこれを処理できます。メソッドはラッパー クラス/インターフェイス タイプ (java.lang.Number など) を取り、ラップされたタイプとして結果を返します。
ただし、アイデア全体を破棄し、2 つのバージョンのみを実装します。float を操作したい呼び出し元は、任意のメソッドの double バージョンを使用できます。パラメーターは自動的に double に拡張されます。結果は、呼び出し元によってキャストされて float に戻される必要があります。double との間の変換には、少し速度がかかります。または、double があればよかったのに、float で間に合う場合は、float バージョンのみを作成します。
生の計算速度に関しては、(デスクトップ CPU では) float と double の間にほとんどまたはまったく違いはありません。通常、float を使用した場合の速度の利点は、メモリ帯域幅の要件が半分になることによるものです。
ユーティリティ クラスが 1 つまたは少数の場合は、それらの 2 つのセットを使用することもできます (例: FloatMathUtil と DoubleMathUtil)。次に、どちらをコーディングするかを決定するのはユーザー次第です (それらは API に関してはまったく無関係なクラスになります)。
オブジェクト指向のアプローチを使用できます。
数学システムに必要なメソッドを実装する独自のクラスを作成します。float の代わりにこのクラスを使用します。内部では、float、double、または BigDecimal を使用できます。システムの残りの部分を変更せずに、後でクラスの動作を変更できます。
Double を見てください。それを構築する方法の一般的なアイデアが得られます。
加算、乗算などのメソッドを実装します。
例えば:
public class MyDecimal
{
private float value;
public MyDecimal(int value)
{
this.value = value;
}
public MyDecimal(float value)
{
this.value = value;
}
public MyDecimal multiply(MyDecimal by)
{
return new MyDecimal(value * by.value);
}
...
}
したがって、float の代わりに double を使用する場合は、このクラスを変更するだけで済みます。