将Object []转换为String []错误

时间:2014-04-25 13:09:04

标签: java object casting

我需要这段代码,但是我收到了这个错误:

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?
}

6 个答案:

答案 0 :(得分:6)

数组的类型为Object[],因此无法知道它只包含String个。很有可能向该数组添加非String对象。因此,不允许演员阵容。

您可以返回Object[],然后将该数组中的每个对象转换为字符串。即(String)arr[0]或者您可以创建一个新的String[]数组并在返回之前复制所有元素。

答案 1 :(得分:1)

每个String都是一个Object。每个对象都不是字符串。

答案 2 :(得分:1)

toArray()返回一个Objects数组。如果你想从中创建一个字符串数组,你必须自己做。例如,

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();

或类似的东西......希望这很有用。

答案 3 :(得分:1)

您无法进行强制转换,因为即使ObjectString的基类,它们的数组类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()]);
}

此代码利用了另一个overload of toArray,它接受​​一个类型化数组作为参数。

答案 4 :(得分:0)

这不能隐式完成,因为运行时无法知道Object[]中的元素都是String类型。

如果您不想自己编写循环,那么强制使用的一种方法是使用

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

认为这将在没有任何字符串副本的情况下发生:asList()绑定到现有的数组数据,而toArray使用泛型,无论如何由于类型擦除。所以这比使用toString()等更快。不要忘记处理任何异常。

答案 5 :(得分:0)

尝试以下代码段

Object[] obj = {"Red","Green","Yellow"}; String[] strArray = (String[]) obj; // Casting from Object[] to String[]