这是我能想到的最好的解决方案了。动态类型识别,数组传递对象 import java.util.ArrayList; import java.lang.reflect.Array;public class TestDynamicCast_1 { static class MyList { ArrayList list;
public MyList(ArrayList list) { this.list = list; } public boolean get(int index, Object[] obj){ Object e = list.get(index); Object ea = Array.newInstance(e.getClass(), 0); if (obj.getClass() == ea.getClass()) { obj[0] = e; return true; } return false; } } public static void main(String[] args) { ArrayList<Object> list = new ArrayList<Object>(); list.add(Integer.valueOf(1)); list.add("Hello"); list.add(list);
MyList ml = new MyList(list); Integer[] i = new Integer[1]; if (ml.get(0, i)) { System.out.println(i[0]); } String[] s = new String[1]; if (ml.get(1, s)) { System.out.println(s[0]); } ArrayList[] lists = new ArrayList[1]; if (ml.get(2, lists)) { System.out.println(lists[0]); } } }
或String str = Object.toString();
你可能只能知道这个容器里总共只有可能有几种类型
然后就
swich(arrayList.getClass().getName().hashCode()){
case "String".hashCode():
......
真的没有其它办法吗?
(String)你的Object
} esle if("其他类型".equals(你的字符串)) {
(其他类型)你的Object}
具体问题具体对待。你要说一下,你转换类型之后要执行什么操作?这样才能回答你的问题。
定义方法:
class MyList extends ArrayList {
....
public boolean get(index id, Object obj){
ele = list.get(id)
if ( ele instanceof obj.getClass()) {
obj = ele;
return true;
} else {
return false;
}
}
}
然后,用户使用:
String s;
myList.get(1, s);
但这么做,一是java不提倡,另外,你给的信息也不够多。所以,如果你只想给用户提供一个容器,到目前为止就足够了。
....
} else if (obj instanceof List) {
......
}
userClass1 uc = (userClass1)o1
}else {
if(userClass2.class.isInstance(o2)){
userClass2 uc = (userClass2)o2
} ........... 其中,userClass1,userClass2等是用户的类型 , o1 , o2是用户从容器中读出的对象。这样用户好像需要写上一堆的if...else...才可以,不方便使用,有没有其它的办法?
import java.util.ArrayList;
import java.lang.reflect.Array;public class TestDynamicCast_1 {
static class MyList {
ArrayList list;
public MyList(ArrayList list) {
this.list = list;
}
public boolean get(int index, Object[] obj){
Object e = list.get(index);
Object ea = Array.newInstance(e.getClass(), 0);
if (obj.getClass() == ea.getClass()) {
obj[0] = e;
return true;
}
return false;
}
}
public static void main(String[] args) {
ArrayList<Object> list = new ArrayList<Object>();
list.add(Integer.valueOf(1));
list.add("Hello");
list.add(list);
MyList ml = new MyList(list); Integer[] i = new Integer[1];
if (ml.get(0, i)) {
System.out.println(i[0]);
} String[] s = new String[1];
if (ml.get(1, s)) {
System.out.println(s[0]);
} ArrayList[] lists = new ArrayList[1];
if (ml.get(2, lists)) {
System.out.println(lists[0]);
}
}
}
MSN: [email protected]
reference instanceof Object
reference.equals(reference)
public boolean get(int index, Object[] obj){
Object e = list.get(index);
if (obj[0].getClass() == e.getClass()) {
// 或者 if (obj[0].getClass().isInstance(e)) { obj[0] = e;
return true;
}
return false;
}
但是,这样就要求用户使用时必须初始化数组,象这样:
Integer[] i = new Integer[1];
i[0] = 0;
ml.get(0, i)我没有办法从得到数组可容纳的元素的类型,好像是不可能的。所以创建一个空数组来作类型匹配检验:
Object ea = Array.newInstance(e.getClass(), 0);
if (obj.getClass() == ea.getClass()) {另外,到目前为止,通过参数传递对象地址只能使用数组,所以我用数组作参数,而不是象最早的帖子中,使用引用作参数。