Ошибка приведения объекта [] к строке []

1

Мне нужен этот код, но я получаю эту ошибку:

Ljava.lang.Object; не может быть добавлено в java.lang.String

public Object[] getAllKeys (){

    return keys.toArray(new Object[keys.size()]); 
}

public String[] getNames (){

    return ((String[])super.getAllKeys()); <- Error here. Can't cast, why?
}
Теги:
object
casting

5 ответов

1
Лучший ответ

toArray() возвращает массив объектов. Если вы хотите создать массив строк из него, вам придется сделать это самостоятельно. Например,

Object [] objects = super.getAllKeys();
int size = objects.size();
String [] strings = new String[size];

for (int i = 0; i < size; i++)
  strings[i] = objects[i].toString();

или что-то подобное... Надеюсь, это полезно.

6

Тип массива - Object[] поэтому он не может знать, что он содержит только String s. Вполне возможно добавить к этому массиву объект non- String. В результате бросок не допускается.

Вы можете вернуть Object[] а затем передать каждый из объектов в этом массиве в строку. т.е. (String)arr[0] или вы можете создать новый массив String[] и скопировать все элементы перед его возвратом.

1

Вы не можете выполнять трансляцию, потому что хотя Object является базовым классом String, классы классов классов Object[] и String[] не связаны.

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

public Object[] getAllKeys (){
    return getAllKeys(new Object[keys.size()]); 
}
// Depending on your design, you may want to make this method protected
public <T> T[] getAllKeys(T[] array){
    return keys.toArray(array); 
}
...
public String[] getNames (){
    return super.getAllKeys(new String[keys.size()]);
}

В этом коде используется другая перегрузка toArray, которая принимает типизированный массив в качестве аргумента.

  • 0
    +1, мило, но я предпочитаю свой путь ;-)
1

Каждая строка является объектом. Каждый объект не является строкой.

0

Это невозможно сделать неявно, поскольку среда выполнения не может знать, что элементы в Object[] - это все типы String.

Если вы не хотите самостоятельно кодировать цикл, то одним из способов принуждения является использование

String[] myStringArray = Arrays.asList(keys).toArray(new String[keys.length]);

Я думаю, что это произойдет без каких-либо строковых копий: asList() привязывается к существующим данным массива, а toArray использует генерики, которые удаляются во время выполнения в любом случае из-за стирания типа. Таким образом, это будет быстрее, чем использование toString() и т.д. Однако не забывайте иметь дело с какими-либо исключениями.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню