将对象转换为Double []

时间:2014-04-01 10:22:10

标签: java casting

我有一个方法,它接受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;

如何让这个功能起作用?

编辑[2014年4月1日,星期二]

我们可以假设以下内容吗?

  1. API完全不受我的控制。
  2. 此功能的参数(data)属于Object[]类型,我无法更改其类型。
  3. 鉴于这些假设,我怎样才能使这个功能起作用?

4 个答案:

答案 0 :(得分:7)

  

我有一个方法,它采用Object

类型的参数

为什么呢?这是一个糟糕的API设计。如果您希望Double[],指定Double[].

  

在运行时,此函数在Line-A处抛出异常:

因为您传递的参数不是Double[].

  

如何让这个功能起作用?

Double[]作为参数传递给它。

答案 1 :(得分:1)

如果您想将Object[]投射到Double[]知道您的阵列中的Object实际上是Double,请使用Arrays.copyOf方法。否则就不可能做到&#34;直接&#34;演员表示,您必须检查您的项目类型并找出如何为其提取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));
}

如果您有更好的方法,请提供答案,如果您有任何疑虑,请发表评论!