如果我使用预定义的类,这就是我的代码:
List<MyClass> result = new ArrayList<MyClass>();
try {
Query query = mgr.newQuery(MyClass.class);
for(Object obj : (List<Object>) query.execute()) {
result.add(((MyClass) obj));
}
}
....
return result;
现在我需要更通用:从通用类名开始(作为字符串,即“TheChosenOne”)我需要做同样的事情,但我无法弄清楚应该如何完成演员表部分。
仅举例说明我正在尝试做的事情:
String str = "TheChosenOne"; //this value may change
Class cls;
List<Object> result = new ArrayList<Object>();
try {
if(str.equals("TheChosenOne"))
cls = Class.forName("com.blabla.TheChosenOne");
else if(str.equals("Rabbit"))
cls = Class.forName("com.blabla.Rabbit");
else if(str.equals("Batman"))
cls = Class.forName("com.heroes.Batman");
else
cls = null;
if(cls != null){
Query query = mgr.newQuery(MyClass.class);
for(Object obj : (List<Object>) query.execute()) {
result.add(((???) obj)); //I need help here!
}
}
}
...
return result;
我选了“Class.forname()...”部分here。
有什么建议吗?提前致谢,最好的问候
答案 0 :(得分:18)
您要做的事情是不必要的,因为您的列表被声明为List<Object>
,因此不需要演员。
- 编辑前 -
我不确定我理解您的需求,但您是否尝试使用:
Class.cast(object)
这是java.lang.Class
的方法答案 1 :(得分:2)
我认为你想要做的事情可以用泛型来实现。
例如这样的方法:
public <E> List<E> getList(Class<E> clazz) {
List<E> result = new ArrayList<E>();
if(clazz != null){
Query query = mgr.newQuery(MyClass.class);
for(E obj : (List<E>)query.execute()) {
result.add(obj);
}
}
return result;
}
可以通过以下方式调用:
getList(TheChosenOne.class)
它将返回List<TheChosenOne>
对象
答案 2 :(得分:1)
如果result
是List<Object>
,那么您根本不需要演员,只需add(obj)
即可。
如果您需要编译时类型安全性,则必须传入Class
对象而不是包含其名称的字符串,并使用通用方法签名
public <T> List<T> doQuery(Class<T> theClass) {
List<T> result = new ArrayList<T>();
try {
Query query = mgr.newQuery(theClass);
for(T obj : (List<T>) query.execute()) {
result.add(obj);
}
}
....
return result;
}
如果你走这条路,并且可以选择修改Query
类,那么你可能要考虑让这个类参数化
public class Query<E> {
public List<E> execute() { ... }
}
// and in mgr
public <T> Query<T> newQuery(Class<T> cls)
然后会让你说
Query<T> query = mgr.newQuery(theClass);
for(T obj : query.execute()) {
result.add(obj);
根本没有施法。
答案 3 :(得分:0)
我相信cls.cast(obj)
正是您所寻找的。 p>
答案 4 :(得分:0)
我认为您需要以这种方式执行此操作:使用instance of
运算符检查类的类型,然后执行类型转换
for(Object obj : (List<Object>) query.execute()) {
if(obj instance of Batman)
result.add(((Batman) obj));
else if(obj instance of Cat)
result.add(((Cat) obj));
// and so on
...
...
}
答案 5 :(得分:0)
将对象放入ArrayList,
时不需要强制转换 result.add(obj);
如果您希望从列表中进行投射
cls .cast(result.get(1));