【问题标题】:Ljava.lang.Object; cannot be cast to [Ljavax.servlet.http.Cookie;Ljava.lang.Object;无法转换为 [Ljavax.servlet.http.Cookie;
【发布时间】:2014-01-23 06:35:29
【问题描述】:

我已经编写了一个自定义 RequestWrapper 来将 cookie 添加到请求中

    @Override
 public Cookie[] getCookies()
 {
         Cookie c=new Cookie("iPlanetDirectoryPro", "macleanpinto");
    Cookie c1=new Cookie("iPlanetDirectoryPro1", "macleanpinto1");

      Collection<Cookie> result = new ArrayList<Cookie>(2);

         result.add(c); 
         result.add(c1);
        return (Cookie[]) result.toArray();


 }

Return 处的上述代码抛出 java.lang.ClassCastException。我无法弄清楚为什么会这样。因为我已经创建了 cookie 集合并且我正在尝试返回 cookie 的数组列表。

谢谢

【问题讨论】:

    标签: java arrays collections classcastexception


    【解决方案1】:

    你可以试试result.toArray(new Cookie[2]); 代替(Cookie[]) result.toArray(); 吗?

    原因 - 仅调用 result.toArray(); 会返回 Object[]

    如果你看到 ArrayList 的源代码

    public Object[] toArray() {
        return Arrays.copyOf(elementData, size);
    }
    

    public <T> T[] toArray(T[] a) {
        if (a.length < size)
            // Make a new array of a's runtime type, but my contents:
            return (T[]) Arrays.copyOf(elementData, size, a.getClass());
    System.arraycopy(elementData, 0, a, 0, size);
        if (a.length > size)
            a[size] = null;
        return a;
    }
    

    这里是后者,显然是使用Arrays.copyOf传递数组的类型

    Object[] 不能转换为Cookie[]

    【讨论】:

      【解决方案2】:

      尝试使用ArrayList.toArray(T[] a)

      例子:

      return result.toArray(new Cookie[result.size()]);
      

      API 中所述,ArrayList.toArray() 返回一个 Object 类型的数组。 Here's 一个线程解释了为什么不能将 Object[] 转换为 String[]。即使您使用的是 Cookie[],同样的原则也适用。

      【讨论】:

      • IMO,最简单最直接的答案。它有效!
      【解决方案3】:

      ArrayList 在内部使用Object[] 来存储元素。因此,当您使用ArrayList#toArray() 方法时,它会返回Object[]

      现在,您不能将Object[] 转换为Cookie[],b'coz Object 不是子类型,而是Cookie 的超类型。例如,考虑下面的代码:

      Object[] objArray = {"a", 1, new Date()};    // an Object[]
      Cookie[] cookieArray = (Cookie[]) objArray;  // You don't expect this to run
      

      所以,如果你想要一个 Cookie[],你必须遍历 Object[] 并手动将每个元素转换为 Cookie 类型,并将其添加到新数组中。这就是ArrayList#toArray(T[]) 所做的。

      因此,您可以将您的退货声明更改为:

      return result.toArray(new Cookie[result.size()]);
      

      我采用result.size() 以避免在方法中创建额外的数组。你也可以通过new Cookie[0]。但是,会在toArray 方法中创建一个新数组。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-12-18
        • 2016-09-05
        • 2013-09-14
        • 1970-01-01
        • 2014-07-08
        • 2012-08-07
        • 1970-01-01
        相关资源
        最近更新 更多