10

私はObject obj私が実際に知っていることを持っていlongます。一部の数学コードでは、として必要doubleです。

直接2倍にキャストしても大丈夫ですか?

double x = (double)obj;

または、最初に長くキャストしてから、2倍にキャストする必要があります。

double x = (double)(long)obj;

私はまた別の(読みにくい)代替案を見つけました:

double x = new Long((long)obj).doubleValue();

どちらかを行うことの危険性/影響は何ですか?

ソリューションの概要

  • objはであり、ではNumberありませんlong
  • Java 6では、明示的なキャストが必要です。例:double x = ((Number)obj).doubleValue()
  • Java 7には、機能するキャストマジックがあります。double x = (long)obj

Java6 / 7の問題の詳細については、TJの回答の説明も参照してください。

編集:私はいくつかの簡単なテストを行いました。キャストの両方の方法(明示的/魔法)は同じパフォーマンスを持っています。

4

5 に答える 5

10

オブジェクトが必要な場合(この場合)、Javaのすべてのプリミティブ番号がそのボックス型にキャストされ、すべてのボックス化された番号は、そうするための最も安全な方法Longのインスタンスです。Number

final Object object = 0xdeadbeefL;
final double d = ((Number)object).doubleValue();

ここでの危険は、いつものように、Object私たちがキャストしたいタイプNumberではないということです。その場合、あなたは。を取得しClassCastExceptionます。次のようなオブジェクトのタイプを確認できます

if(object instanceof Number) ...

クラスキャスト例外を防止し、代わりに。のようなデフォルト値を指定する場合0.0。また、黙って失敗する方法は必ずしも良い考えではありません。

于 2012-12-13T08:47:38.783 に答える
7

私はObject obj私が実際に知っていることを持っていlongます。

いいえ、しません。longはプリミティブデータ型であり、Javaのプリミティブ型はオブジェクトではありません。longプリミティブ型とjava.lang.Longラッパークラスである、には違いがあることに注意してください。

Long(オブジェクト)をlong(プリミティブ)にキャストすることはできません。longから値を取得するには、次のLongように呼び出しますlongValue()

Long obj = ...;

long value = obj.longValue();

直接キャストしてもdouble大丈夫ですか?

それが実際にプリミティブである場合longは、はい、それをにキャストできますdouble。オブジェクトの場合Longは、キャストする必要はありません。呼び出すだけですdoubleValue()

double x = obj.doubleValue();
于 2012-12-13T08:33:33.697 に答える
0

ObjectからLongまたはlongへのキャストは1つだけ必要です(これは暗黙的にLongにキャストしてから、ボックス化解除を適用します)。

Object o = 5L;
double d = (long) o; //Apparently only works on Java 7+
//or
double d = (Long) o;
于 2012-12-13T08:32:22.497 に答える
0

単純なキャストは完全にうまくいくはずです。これは、ラッパークラスを経由して文字列表現を取得し、次に解析してdoubleを実行し、long値を使用して新しいインスタンスを再度作成するよりも高速です。さらに重要なことに、より読みやすくなります。

double d = (double)15234451L;
于 2012-12-13T08:32:29.363 に答える
0

これをLongObjectではなく)にキャストしてから、:にキャストlongできます。LongLongdouble

double d = (double)(Long)obj;

たとえば、これは2.6666666666666665の期待される出力を持っています:

public class CastDouble {
    public static final void main(String[] args) {
        Object o = 15L;

        System.out.println(40 / (double)(Long)o);
    }
}
于 2012-12-13T08:33:57.977 に答える