私がこれを持っているとしましょう:
Object obj = new Double(3.14);
に明示的にキャストせずに、のobj
ように使用する方法はありますか? たとえば、for の計算方法を使用したいとします。Double
Double
.doubleValue()
Double
いいえ、これを行う方法はありません。obj
は(インスタンスObject
であっても) タイプであり、クラスには などのメソッドがありません。適切な方法は実際にキャストすることです:Double
Object
doubleValue()
Double d = (Double) obj;
キャストできない場合に行う唯一の方法は、リフレクションを使用することです。
Object obj = new Double(3.14);
Method m1 = obj.getClass().getMethod("doubleValue");
System.out.println("Double value: " + m1.invoke(obj));
Method m2 = obj.getClass().getMethod("intValue");
System.out.println("Int value: " + m2.invoke(obj));
Double value: 3.14
Int value: 3
これは通常、一部の限られたコーナー ケースでのみ役立ちます。通常、キャスト、ジェネリック、または何らかのスーパータイプの使用が適切なアプローチです。
それはいけません。
への参照であるため、自由にObject
使用できるメソッドのみが表示されます。Object
Number
、 などのスーパークラスでありInteger
、Short
を定義するを使用できることに注意してください.doubleValue()
。
final Number n = new Double(2.0);
n.doubleValue(); // works
あなたができる最も近いのはこれです
Number num = new Double(3.14);
double d= num.doubleValue();
オブジェクトの実行時の型に基づいてではなく、コンパイラが使用できることを認識しているメソッドのみを呼び出すことができます。
つまりObject
、 doubleValue() メソッドがないため、呼び出すことはできません。呼び出したいメソッドを持つ参照型が必要です。
いいえ、できません。インスタンスobj
は への参照であり、クラスObject
のメソッドのみを見ることができます。クラスの特定のメソッドを使用するには、Object
キャストする必要があります。Double
Double
いいえ!唯一の代替手段は、次を使用することです。
obj.toString()
または、double として使用するには:
Double.parseDouble(obj.toString())
しかし、それは良い習慣ではありません。確かに、あなたのケースに代わる別の良い選択肢があります。コードを投稿する