JAVA-cast使用通过名称(字符串值)获得的类
如果使用预定义类,我的代码就是这样的:JAVA-cast使用通过名称(字符串值)获得的类,java,class,reflection,casting,Java,Class,Reflection,Casting,如果使用预定义类,我的代码就是这样的: List<MyClass> result = new ArrayList<MyClass>(); try { Query query = mgr.newQuery(MyClass.class); for(Object obj : (List<Object>) query.execute()) { result.add(((MyClass) obj)); } } .... retu
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;
List result=new ArrayList();
试一试{
Query Query=mgr.newQuery(MyClass.class);
for(Object obj:(List)query.execute()){
结果.添加(((MyClass)obj));
}
}
....
返回结果;
现在我需要更加通用:从通用类名(作为字符串,即“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;
String str=“TheChosenOne”//此值可能会更改
cls类;
列表结果=新建ArrayList();
试一试{
如果(str.equals(“TheChosenOne”))
cls=Class.forName(“com.blabla.TheChosenOne”);
else if(str.equals(“兔子”))
cls=Class.forName(“com.blabla.Rabbit”);
否则如果(str.equals(“蝙蝠侠”))
cls=Class.forName(“com.heroses.Batman”);
其他的
cls=null;
如果(cls!=null){
Query Query=mgr.newQuery(MyClass.class);
for(Object obj:(List)query.execute()){
result.add((???)obj));//我需要帮助!
}
}
}
...
返回结果;
我选了“Class.forName()…”部分
有什么建议吗?提前感谢,致以最诚挚的问候我相信
cls.cast(obj)
就是您要寻找的。您尝试做的事情是不必要的,因为您的列表声明为list
,因此不需要强制转换
--编辑前--
我不知道您需要什么,但您是否尝试使用:
Class.cast(object)
这是java.lang.Class的一个方法如果
结果
是一个列表
,那么您根本不需要强制转换,只要添加(obj)
就可以了
如果需要编译时类型安全性,则必须传入类
对象,而不是包含其名称的字符串,并使用泛型方法签名
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<T> query = mgr.newQuery(theClass);
for(T obj : query.execute()) {
result.add(obj);
Query Query=mgr.newQuery(类);
for(T obj:query.execute()){
结果:添加(obj);
完全没有强制转换。我认为您需要这样做:使用
操作符的实例检查类的类型,然后执行类型强制转换
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
...
...
}
(对象对象对象:(列表)query.execute()的{
if(蝙蝠侠的obj实例)
结果。添加(((蝙蝠侠)obj));
else if(Cat的obj实例)
结果:添加(((Cat)obj));
//等等
...
...
}
将对象放入ArrayList时不需要强制转换
result.add(obj);
如果你愿意,你可以在从列表中获取时施放
cls .cast(result.get(1));
我认为你试图做的事情可以通过泛型来实现
例如,类似这样的方法:
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;
}
它将返回一个列表
对象结果。add((Class.cast(obj))
与结果相同。add(obj)
。因为列表是object类型,我需要根据str字符串的值返回一个chosenone类的列表、一个Rabbit类的列表或一个Batman类的列表。。
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)