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

の場合resultList<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

オブジェクトをArrayListに入れるときにキャストする必要はありません。

 result.add(obj); 

必要に応じて、リストから取得しながらキャストできます

 cls .cast(result.get(1));
于 2013-02-20T08:43:00.937 に答える
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 に答える