2013-02-20 8 views
10

questo è ciò che il mio codice è se io uso una classe predefinita:JAVA - gettato utilizzando la classe ottenuta con il suo nome (valore stringa)

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; 

ora ho bisogno di essere più generico: a partire da un nome di classe generica (come una stringa, vale a dire "TheChosenOne") Ho bisogno di fare la stessa cosa, ma non riesco a capire come dovrebbe essere fatta la parte cast ..

Solo per fare un esempio di quello che sto cercando di do:

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; 

Ho preso la "Classe" .forname() ... "parte here.

Qualche suggerimento? Grazie in anticipo, cordiali saluti

risposta

16

Quello che stai cercando di fare è inutile perché la tua lista è dichiarata come List<Object> quindi il cast non è necessario.

- Prima di Modifica -

Non sicuro di aver capito quello che ti serve, ma ha fatto si tenta di utilizzare:

Class.cast(object) 

Questo è un metodo della java.lang.Class

+0

'result.add ((Class.cast (obj))) 'è uguale a' result.add (obj) '. Perché l'elenco è di tipo Oggetto – cowls

+0

@ cowls aha! hai ragione, modifico la risposta. –

0

Credo che cls.cast(obj) sia quello che stai cercando.

1

Se result è un List<Object> quindi non è necessario un cast, semplicemente add(obj) funzionerà correttamente.

Se avete bisogno di compilare il tempo di sicurezza tipo allora si dovrà passare l'oggetto Class piuttosto che una stringa contenente il suo nome, e utilizzare un metodo di firma generica

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; 
} 

Se seguire questa strada, e hanno la possibilità di modificare la classe Query allora si potrebbe prendere in considerazione facendo quella classe parametrizzata

public class Query<E> { 
    public List<E> execute() { ... } 
} 

// and in mgr 
public <T> Query<T> newQuery(Class<T> cls) 

che sarebbe poi lasciare che dici

0.123.
Query<T> query = mgr.newQuery(theClass); 
    for(T obj : query.execute()) { 
     result.add(obj); 

senza alcun tipo di trasmissione.

+0

Ho bisogno di restituire un elenco della classe TheChosenOne o un elenco di classe Rabbit o un elenco di classe Batman, in base al valore della stringa str. – BeNdErR

0

Credo che hai bisogno di farlo in questo modo: usando instance of all'operatore di controllare il tipo della classe e poi fare il casting di tipo

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 
    ... 
    ... 
} 
0

non avete bisogno di getto mentre mettendo oggetto nel ArrayList,

result.add(obj); 

Se si vuole si può lanciare durante il recupero dalla lista

cls .cast(result.get(1)); 
2

Penso che quello che stai cercando di fare possa essere raggiunto con i generici.

Ad esempio, un metodo come questo:

 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; 
    } 

può essere chiamato con:

getList(TheChosenOne.class) 

e restituirà un oggetto List<TheChosenOne>

Problemi correlati