我需要这段代码,但是我收到了这个错误:
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?
}
答案 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)
您无法进行强制转换,因为即使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()]);
}
此代码利用了另一个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[]