在JAVA中如何將一個(gè)Object轉(zhuǎn)換成Array?
照例應(yīng)該先說一下這個(gè)問題的來源,因?yàn)橛行枰也沤鉀Q他(需要結(jié)果的請(qǐng)直接看最后)
那么這個(gè)問題的來源是這樣的
在某個(gè)不知名的小屁項(xiàng)目中,使用了Hibernate,在查詢的時(shí)候,使用hql查詢,設(shè)置查詢條件的時(shí)候使用 in 方式 ,比如:
select username from user where id in (:id)
然后設(shè)置參數(shù)的時(shí)候,hibernate要求這個(gè)參數(shù)為Array(Object[])或者List(Collection)
然后,因?yàn)槲疫@個(gè)方法是通用的,所以這里的參數(shù)是用一個(gè) Map<String,Object> 傳入的,這就導(dǎo)致我在解析的時(shí)候必須將這個(gè)Object轉(zhuǎn)換成Object[]
當(dāng)然經(jīng)過我的實(shí)踐,這里的解決方式其實(shí)很簡(jiǎn)單
List<String> l = new ArrayList<String>();
l.add("ss1");
l.add("ss2");
l.add("ss3");
l.add("ss4");
l.add("ss5");
String[] sarr = new String[l.size()];
l.toArray(sarr);
for (Object string : (Object[])sarr) {
System.out.println(string);
}
這個(gè)代碼是能通過編譯并且執(zhí)行成功的也就是說,我還轉(zhuǎn)個(gè)皮啊。。。直接寫就ok了……
如果是這樣,那我還寫這個(gè)文干啥?所以,注意:
List<String> l = new ArrayList<String>();
l.add("ss1");
l.add("ss2");
l.add("ss3");
l.add("ss4");
l.add("ss5");
String[] sarr = (String[])l.toArray();
for (String string : sarr) {
System.out.println(string);
}
這段代碼執(zhí)行是不成功的!在我機(jī)器上執(zhí)行結(jié)果(jdk7):
Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;
List中不帶參的toArray方法返回的是Object[],并且不能直接轉(zhuǎn)成String[]綜上,String[]可以轉(zhuǎn)成Object[],但是反過來就不行
現(xiàn)在回到我題目中的問題,上代碼第一步,確定傳入的這個(gè)Object是一個(gè)Array第二步,獲取這個(gè)Array的長(zhǎng)度第三步,創(chuàng)建一個(gè)相同長(zhǎng)度的數(shù)組(什么類型根據(jù)你的需求自定義,前提是能兼容,比如我的代碼是寫Object,不管是啥都能進(jìn)去了)第四步,挨個(gè)取出原來數(shù)組中的元素放到新的數(shù)組中
import java.lang.reflect.Array
..............
if (obj.getClass().isArray()) {
int length = Array.getLength(obj);
Object[] os = new Object[length];
for (int i = 0; i < os.length; i++) {
os[i] = Array.get(obj, i);
}
}
以上
希望可以幫到您!