17

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

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()...”部分。

有什么建议么?在此先感谢,最好的问候

4

6 回答 6

24

您尝试做的事情是不必要的,因为您的列表已声明为不需要List<Object>演员表。

-- 编辑前 --

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

Class.cast(object)

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

于 2013-02-20T08:37:38.967 回答
3

我认为您尝试做的事情可以通过泛型来实现。

例如这样的方法:

     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>对象

于 2013-02-20T08:47:43.833 回答
2

如果result是 aList<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);

根本没有铸造。

于 2013-02-20T08:38:39.383 回答
0

我相信cls.cast(obj)这就是你要找的。

于 2013-02-20T08:37:37.953 回答
0

我认为您需要这样做:使用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
  ...
  ...
}
于 2013-02-20T08:40:48.923 回答
0

将对象放入 ArrayList 时不需要强制转换,

 result.add(obj); 

如果你愿意,你可以从列表中获取

 cls .cast(result.get(1));
于 2013-02-20T08:43:00.937 回答