JAVA - 使用由其名称(字符串值)获取的类进行强制转换

2022-09-03 00:47:06

如果我使用预定义的类,这就是我的代码的外观:

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()...”部分在这里

有什么建议吗?提前致谢,最好的问候


答案 1

您尝试执行的操作是不必要的,因为您的列表已声明为不需要强制转换。List<Object>

- 编辑前 -

不确定我是否理解您的需求,但您是否尝试过使用:

Class.cast(object)

这是java.lang.Class的一种方法


答案 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>