1

说我有这个:

Object obj = new Double(3.14);

有没有办法obj像 a 一样使用Double而不显式地将其转换为Double?例如,如果我想使用for 计算的.doubleValue()方法。Double

4

6 回答 6

5

不,没有办法做到这一点。obj是类型的Object(即使它是一个Double 实例),并且Object该类没有doubleValue(). 正确的方法确实是投:

Double d = (Double) obj;
于 2013-06-12T14:52:01.923 回答
3

如果您不能投射,唯一的方法是使用反射

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

这通常只在一些有限的极端情况下有用——通常,强制转换、泛型或使用某些超类型是正确的方法。

于 2013-06-12T14:59:17.453 回答
2

你不能。

由于您引用的是 a Object,因此您将只有可以使用的方法Object

请注意,您可以使用Number, 它是 , 等的超类IntegerShort它定义了.doubleValue()

final Number n = new Double(2.0);
n.doubleValue(); // works
于 2013-06-12T14:52:04.680 回答
2

你能做的最接近的是这个

Number num = new Double(3.14);
double d= num.doubleValue();

您只能调用编译器知道可用的方法,而不是基于对象的运行时类型。

简而言之Object,没有 doubleValue() 方法,因此您无法调用它。您必须有一个引用类型,它具有您要调用的方法。

于 2013-06-12T14:52:49.443 回答
1

不,这是不可能的。实例obj是对 an 的引用,Object只能看到Object类的方法。您必须将其强制转换Double为使用Double该类的特定方法。

于 2013-06-12T14:52:03.520 回答
0

不!唯一的选择是使用:

obj.toString()

或者,用作双重:

Double.parseDouble(obj.toString())

但这不是一个好习惯。当然,您的情况还有其他不错的选择。发布您的代码

于 2013-06-12T14:52:45.630 回答