2014-01-23 4 views
1

Я написал пользовательский RequestWrapper добавить печенье в просьбуLjava.lang.Object; не может быть применено к [Ljavax.servlet.http.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.

Благодаря

ответ

3

вы можете попробовать 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[]

+1

Можете ли вы объяснить, почему он не работает? – Keerthivasan

+0

OKie. Спасибо –

1

Попробуйте использовать ArrayList.toArray(T[] a).

Пример:

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

Как указано в API, ArrayList.toArray() возвращает массив типа Object. Here's нить, объясняющая, почему вы не можете использовать Object [] для String []. Несмотря на то, что вы используете Cookie [], применяется тот же принцип.

+1

Можете ли вы объяснить, почему он не работает? – Keerthivasan

2

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.

Смежные вопросы