Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JAVA-cast使用通过名称(字符串值)获得的类_Java_Class_Reflection_Casting - Fatal编程技术网

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)