如果我使用预定义的类,这就是我的代码的样子:
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()…"部分。
有什么建议吗?提前感谢,向致以最良好的问候
您尝试执行的操作是不必要的,因为您的列表已声明为List<Object>
,因此不需要强制转换。
--编辑前——
我不知道你需要什么,但你试过使用吗
Class.cast(object)
这是java.lang.Class 的一个方法
我认为您想要做的事情可以通过泛型来实现。
例如这样的方法:
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>
对象
如果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);
根本没有铸造。
我相信cls.cast(obj)
就是您想要的。
我认为您需要这样做:使用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
...
...
}
在将对象放入ArrayList、时不需要强制转换
result.add(obj);
如果你想,你可以在从列表中获得的同时进行投掷
cls .cast(result.get(1));