[java.lang.String; нельзя привести к java.lang.String

Я получаю вектор из API продукта.

Vector<?> dataVector = dataAPI.getReturnVector();

Ожидается, что вектор будет содержать строки в качестве значения. Я могу напечатать размер вектора как 2. Но по какой-то причине я не могу выполнить итерацию и распечатать значения.

Я старался

Iterator<?> iter = dataVector.iterator();

while( iter.hasNext()) {
    System.out.println(iter.next());
}

Я всегда получаю

[java.lang.String; cannot be cast to java.lang.String

я использовал

iter.next().getClass().getName() 

а оказалось, что только java.lang.String.

Я немного погуглил и нашел похожую проблему на http://prideafrica.blogspot.com/2007/01/javalangclasscastexception.html

Я попытался установить дженерики как String[], но получил ту же ошибку.

Если вектор содержит java.lang.String, почему я получаю это исключение приведения? Как я могу распечатать фактические значения?

Пожалуйста, предоставьте свои предложения.


person jobinbasani    schedule 01.02.2012    source источник
comment
Откуда взялась эта точка с запятой?   -  person Tom Hawtin - tackline    schedule 01.02.2012
comment
Возможно, сообщение об ошибке начиналось с открывающей скобки, например [java.lang.String;? Это будет внутреннее имя массива String.   -  person Jörn Horstmann    schedule 01.02.2012
comment
Ах да, все началось с открытой скобки[. Извините, что пропустил это. Я не знал, что это будет иметь значение.   -  person jobinbasani    schedule 01.02.2012
comment
Что делает кастинг? Это итератор?   -  person Bhesh Gurung    schedule 01.02.2012
comment
Что это за API продукта? Может ли быть несоответствие версии байт-кода Java?   -  person Viruzzo    schedule 01.02.2012
comment
@βнɛƨнǤʋяʋиɢ Итератор выполняет кастинг.   -  person jobinbasani    schedule 01.02.2012
comment
@Viruzzo Это API сетевого продукта, и я смог без проблем использовать другие API. Javadocs тоже мало что говорит...   -  person jobinbasani    schedule 01.02.2012


Ответы (3)


Таким образом, API возвращает не вектор строк, а вектор строки [].

Вы должны иметь возможность перебирать вектор, а затем для каждого элемента перебирать массив.

Iterator<String[]> iter = dataVector.iterator();

while( iter.hasNext()) {
    String[] array = iter.next();
    for(int i=0; i < array.length; i++)
    {
       System.out.println(i + ": " + array[i]);
    }
}
person Peter Jamieson    schedule 01.02.2012
comment
Спасибо! Это сработает. в моем случае, как вы сказали, Вектор возвращал String[]. По какой-то причине метод API не «заполнил» массивы String, как ожидалось... - person jobinbasani; 01.02.2012

Попробуйте сравнить их classLoaders. Если они разные, то возникает это исключение.

StringClass1.getClassLoader()==StringClass2.getClassLoader();
person Balconsky    schedule 01.02.2012
comment
Похоже, что-то пытается преобразовать массив String в String. - person Bhesh Gurung; 01.02.2012

Нет необходимости использовать итератор. Вы можете просто использовать метод elementAt(index) Vectors для печати значений. Используйте цикл For, чтобы получить индексы Vector.

Пример:

Vector<?> dataVector = dataAPI.getReturnVector();
for(int i = 0; i < dataVector.size(); i++) {
    System.out.println(dataVector.elementAt(i));
}

Если вы получаете странный ответ (цифры и буквы), вы получаете объект String[]. Это означает, что вам придется использовать встроенный метод Arrays для печати массива String[]. Смотрите комментарии ниже.

person Roshnal    schedule 01.02.2012
comment
Он печатает [Ljava.lang.String;@25a091[Ljava.lang.String;@50a11a - person jobinbasani; 01.02.2012
comment
@whoopy_whale: Вы можете сделать System.out.println(Arrays.toString(dataVector.elementAt(i)));. - person Bhesh Gurung; 01.02.2012
comment
@βнɛƨнǤʋяʋиɢ Чтобы использовать Arrays.toString, мне пришлось использовать дженерики как Vector‹String[]›, и результат был [][] - person jobinbasani; 01.02.2012
comment
@Roshnal Пробовал с методом Arrays, и он печатает [] [] (пустые массивы) - person jobinbasani; 01.02.2012
comment
Хорошо... разобрался... API возвращает вектор размера два, а значения представляют собой два массива строк. Ожидается, что эти массивы String будут содержать значения, и в этом случае по какой-то причине они были пустыми. Это проблема только с вызовом API. Но, как вы все сказали, исключение приведения было связано с String[] и String. Спасибо за помощь! - person jobinbasani; 01.02.2012