[英]JAVA - cast using class obtained by its name (string value)
如果我使用预定义的类,这就是我的代码的样子:
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));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.