2016-11-22 4 views
0

verwenden würde ich die Methode wie unten erstellen:eine generische Klasse als eine Art von Java-Liste

@Override 
public List<?> listerUser(Class<?> nomClass) throws GestionExceptionsDAO { 

    Object tableSQL; 

    try { 
     tableSQL = nomClass.newInstance(); 
    } catch (InstantiationException e1) { 
     e1.printStackTrace(); 
    } catch (IllegalAccessException e1) { 
     e1.printStackTrace(); 
    } 

    List<tableSQL> listeUser;//Error : tableSQL cannot be resolved to a type 

    Session session = sessionFactory.openSession(); 
    session.beginTransaction(); 
    Query requete = session.createQuery(REQUETE_LIST); 
    requete.setParameter(REQUETE_LIST, tableSQL); 

    try { 
     listeUser = (List<tableSQL>) requete.getResultList(); 
    } catch (NoResultException e) { 
     throw null; 
    } catch (Exception e) { 
     throw new GestionExceptionsDAO(e); 
    } finally { 
     session.close(); 
    } 
    return listeUser; 
} 

Was ich versuche, eine Methode zu tun ist, zu schaffen, die ein Klassenname im Parameter nimmt und gibt eine Liste von Objekten dieser Klasse. Ich denke, es ist einfach, aber ich finde einige Schwierigkeiten, es zu tun. Danke vielmals.

+0

Wie pro Ihre Beschreibung ("ein Verfahren schaffen, die in Parameter übernimmt ein Klassenname und gibt eine Liste von Objekten dieser Klasse zurück ") Die Signatur der Methode sollte" Liste ListerUser (Klasse Typ) "sein. Weitere Informationen finden Sie unter [Generische Methoden (The Java ™ Tutorials)] (https://docs.oracle.com/javase/tutorial/extra/generics/methods.html). – Seelenvirtuose

Antwort

3

Sie keinen Verweis auf verwenden kann eine Instanzvariable, um einen generischen Typ zu parametrisieren.

Das Idiom Sie wahrscheinlich suchen, ist das eine für eine generische Methode, die eine List mit dem Typ des gegebenen Class Argument parametrisiert zurückgibt:

public <T>List<T> listerUser(Class<T> nomClass) { 
    List<T> result = new ArrayList<>(); 
    // TODO populate the result based on your query 
    return result; 
} 

Sie auch T an Kinder oder Eltern von binden können eine gegebene Klasse/Schnittstelle (einschließlich oberer/unterer Grenzen) unter Verwendung der Schlüsselwörter extends oder super.

Zum Beispiel gegeben eine Definition:

public <T extends CharSequence>List<T> listerUser(Class<T> nomClass) 

Der Aufruf könnte:

List<String> list = listerUser(String.class); 

Hinweise

  • Docs auf generische Methoden here.
  • Wenn Sie sich mit Reflexion planen eine neue Instanz von T (zB T t = nomClass.newInstance();) zu initialisieren, müssen Sie werfen oder Griff IllegalAccessException und InstantiationException
+0

Danke für diese Erklärungen, aber es gibt etwas, das ich nicht verstehen kann. Warum das: 'public Liste ' und nicht nur 'öffentliche Liste '? – akuma8

+0

@ akuma8 das ist die generische Methode Idiom Syntax: Sie müssen die generischen Typ Argumente vor dem eigentlichen Rückgabetyp angeben, die sonst nicht gelöst werden können - siehe [hier] (https://docs.oracle.com/javase/tutorial/extra /generics/methods.html). – Mena

2

Sie könnten den gleichen generischen parametrisierte Typen im Parametertyp und das Typ-Objekt verwenden, zurückgegeben:

public <T> List<T> listerUser(Class<T> nomClass) throws GestionExceptionsDAO 

Nachdem man es so nennen kann:

List<String> listerUser = listerUser(String.class); 
+0

Funktioniert sehr gut Vielen Dank :) – akuma8

+0

Sie sind willkommen :) – davidxxx

Verwandte Themen