Приведение от типа объекта к классу - PullRequest
1 голос
/ 31 мая 2011

В настоящее время я пытаюсь заполнить массив объектов типа Stipulations, который является классом,

public abstract interface

Мой метод заполнения этого массива следующий, где popStipAttr - это простой оператор switch.

    public static Stipulations[] popStipArr(ZASAllocation zasAlloc) 

    {
          //ArrayList<String> s = new ArrayList<String>();
          ArrayList<Stipulations> stipAL  = new ArrayList<Stipulations>();

          for(int i = 0; i < NoStip; i++)
          {
          stipAL.add(popStipAttr(i,zasAlloc));
          }

          Stipulations[] StipArr =  (Stipulations[]) stipAL.toArray();
          return StipArr;
    }

Однако я получаю сообщение об ошибке:

Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Lc.Stipulations;

Что именно я делаю не так здесь, я создал arraylist того же типа, почему бы прикрывать его массивом этого типа?

Ответы [ 2 ]

4 голосов
/ 31 мая 2011

ArrayList.toArray возвращает Object[] (который, как указано в сообщении, не может быть приведен к Stipulations[]).ArrayList.toArray(T[] a) однако возвращает T[].Таким образом, измените

Stipulations[] StipArr =  (Stipulations[]) stipAL.toArray();

на

Stipulations[] StipArr =  (Stipulations[]) stipAL.toArray(new Stipulations[0]);
                                                          ^^^^^^^^^^^^^^^^^^^

О, верно.Просто понял, что могло вызвать путаницу.Ведущий [ в [Ljava.lang.Object; указывает, что это массив.То же самое для [Lc.Stipulations;.Возможно, именно поэтому вы написали приведение типа объекта к классу в качестве заголовка :-) Теперь вы все равно знаете: -)

0 голосов
/ 31 мая 2011

То, что вы делаете в

Stipulations[] StipArr =  (Stipulations[]) stipAL.toArray();

, вызывает метод класса java.util.List

Object[] toArray(); 

, который возвращает вам объект [], который не может быть приведенк вашим положениям []
То, что вы хотите вызвать, - это метод на java.util.List

<T> T[] toArray(T[] a);

, который вернет вам массив с вашим типом.Так что попробуйте

Stipulations[] StipArr =  stipAL.toArray(new Stipulations[stipAL.size()]);

Это странный синтаксис, который имеет тенденцию загрязнять код, и по этой причине, и несколько других, я всегда стараюсь использовать списки, где это возможно, и никогда не конвертировать в и из массивов, если это абсолютно не нужно, каквнешний API не под моим контролем требует

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...