Мне нужен этот код, но я получаю эту ошибку:
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?
}
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();
или что-то подобное... Надеюсь, это полезно.
Тип массива - Object[]
поэтому он не может знать, что он содержит только String
s. Вполне возможно добавить к этому массиву объект non- String
. В результате бросок не допускается.
Вы можете вернуть Object[]
а затем передать каждый из объектов в этом массиве в строку. т.е. (String)arr[0]
или вы можете создать новый массив String[]
и скопировать все элементы перед его возвратом.
Вы не можете выполнять трансляцию, потому что хотя 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
, которая принимает типизированный массив в качестве аргумента.
Каждая строка является объектом. Каждый объект не является строкой.
Это невозможно сделать неявно, поскольку среда выполнения не может знать, что элементы в Object[]
- это все типы String
.
Если вы не хотите самостоятельно кодировать цикл, то одним из способов принуждения является использование
String[] myStringArray = Arrays.asList(keys).toArray(new String[keys.length]);
Я думаю, что это произойдет без каких-либо строковых копий: asList()
привязывается к существующим данным массива, а toArray
использует генерики, которые удаляются во время выполнения в любом случае из-за стирания типа. Таким образом, это будет быстрее, чем использование toString()
и т.д. Однако не забывайте иметь дело с какими-либо исключениями.