我有一个方法,它接受Object类型的参数。
protected Object foo(Object data) {
Double[] values = (Double[]) data; //Line-A
return Math.sqrt(Math.pow(values[0] - values[3], 2)
+ Math.pow(values[1] - values[4], 2)
+ Math.pow(values[2] - values[5], 2));
}
在运行时,此函数在Line-A处抛出异常:
java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Double;
如何让这个功能起作用?
我们可以假设以下内容吗?
data
)属于Object[]
类型,我无法更改其类型。鉴于这些假设,我怎样才能使这个功能起作用?
答案 0 :(得分:7)
我有一个方法,它采用Object
类型的参数
为什么呢?这是一个糟糕的API设计。如果您希望Double[],
指定Double[].
在运行时,此函数在Line-A处抛出异常:
因为您传递的参数不是Double[].
如何让这个功能起作用?
将Double[]
作为参数传递给它。
答案 1 :(得分:1)
如果您想将Object[]
投射到Double[]
知道您的阵列中的Object
实际上是Double
,请使用Arrays.copyOf
方法。否则就不可能做到"直接"演员表示,您必须检查您的项目类型并找出如何为其提取double
值
也许更优化的方法是使用Arrays.asList
方法直接将其投放到List<Double>
。 (因为Arrays.asList
没有复制数组)
示例:
static void test(Object[] a) {
Double[] dummy = Arrays.copyOf(a, a.length, Double[].class);
System.out.println(dummy[0]); // prints 42.0
}
public static void main (String[] args)
{
Object[] a = new Object[1];
a[0] = new Double(42.0);
test(a);
}
通用列表转换的示例:
static void test(Object[] a) {
List<Double> dummy = (List<Double>)((List<?>)(Arrays.asList(a)));
System.out.println(dummy.get(0));
}
答案 2 :(得分:0)
为什么需要Object
参数?你期待Double[]
所以使用Double[].
当你真的不知道会发生什么(通用类型可能是?)时,对象是有用的,并且无论如何都需要更复杂的设计。在这种情况下使用Object
是毫无意义且糟糕的API设计
所以就这样做
protected Double foo(Double[] data) {
Double[] values = data; //Line-A
return Math.sqrt(Math.pow(values[0] - values[3], 2)
+ Math.pow(values[1] - values[4], 2)
+ Math.pow(values[2] - values[5], 2));
}
答案 3 :(得分:0)
这就是我做到的。
protected Object foo(Object data) {
Double[] values = new Double[6];
Object[] objectArr = (Object[]) data;
int index = 0;
for (Object object : objectArr) {
values[index] = (Double)object;
index++;
}
return Math.sqrt(Math.pow(values[0] - values[3], 2)
+ Math.pow(values[1] - values[4], 2)
+ Math.pow(values[2] - values[5], 2));
}
如果您有更好的方法,请提供答案,如果您有任何疑虑,请发表评论!