我有一种从数据库获取联系人列表的方法。它返回一个列表
public List<String[]> getContacts(String param) {
...
Query q = this.getCurrentSession().createSQLQuery("
select first_name, last_Name, email_address, fax
from contacts
where first_name = :param");
q.setParameter("param", param);
List<String[]> listResult = q.list();
return listResult;
}
当我使用以下代码获取联系人姓名时:
List<String[]> contacts = (ArrayList<String[]>) contactManager.getContacts(fistName);
if (contacts != null && contacts.size() > 0) {
person.setLastName(contacts.get(0)[1]); //error line
}
我收到错误:
java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;
我将源代码更改为:
List<String[]> contacts = (ArrayList<String[]>) contactManager.getContacts(fistName);
if (contacts != null && contacts.size() > 0) {
Object[] objTemp = contacts.get(0);
String temp = (String) objTemp[1];
person.setLastName(temp);
}
运行良好!
我已经调试过了,getContacts()函数返回的对象仍然是List。看起来对象刚刚转换为 List,当时错误行运行。
请帮我解释一下为什么第二个代码可以运行而没有错误。我认为两个来源的逻辑相同。
最佳答案
在这里您尝试显式转换:
List<String[]> contacts = (ArrayList<String[]>) contactManager.getContacts(fistName)
但是当你执行这个时:
contacts.get(0)[1]
它首先将数组的运行时类型(Object[])转换为 String[],如下所示:
Object[] colors = { "red", "green", "blue" };
String[] colorsStrings = (String[]) colors; // -> class cast exception
你得到:
java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;
它正确地告诉您正在尝试将 Object
数组 (Object[].class
) 转换为 String
数组(String[].class
)。
因此,您需要首先从列表中显式获取 Object[],然后将单个项目从 Object 转换为 String,如上一个示例所示。
如果您使用 Java 8,另一个选项是:
String[] contacts = Arrays.stream(contactManager.getContacts(fistName))
.toArray(String[]::new);
关于java - 将 List<Object[]> 转换为 List<String[]>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23560592/