2016-11-22 4 views
0

Я хотел бы создать ниже METHODE:Используя общий класс как тип списка Java

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

То, что я пытаюсь сделать, это создать метод, который принимает в параметре имя класса и возвращает список объектов этого класса. Я думаю, что это просто, но я нахожу некоторые трудности для этого. Большое спасибо.

+0

согласно вашему описанию ("создать метод, который принимает в параметре имя класса и возвращает список объектов этого класса »), подпись метода должна быть« Список listerUser (класс ). Дополнительную информацию см. В разделе «Общие методы (Учебники Java ™)] (https://docs.oracle.com/javase/tutorial/extra/generics/methods.html). – Seelenvirtuose

ответ

3

Вы не можете использовать ссылку переменную экземпляра, чтобы параметризовать общий тип.

идиомы вы, вероятно, ищете это один для универсального метода, который возвращает List параметризованный с типом данного Class аргумента:

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

Вы также можете связать T для детей или родителя данный класс/интерфейс (включая верхние/нижние границы), используя ключевые слова extends или super.

Например, дано определение:

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

может быть Заклятие:

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

Примечания

  • Docs на общих методах here.
  • Если вы планируете использовать отражение для инициализации нового экземпляра T (например T t = nomClass.newInstance();), вам нужно бросить или обрабатывать IllegalAccessException и InstantiationException
+0

Спасибо за эти объяснения, но есть кое-что, что я не могу понять. Почему это: 'public Список ', а не только 'public List '? – akuma8

+0

@ akuma8 - это синтаксис идивидуального метода: вам нужно указать аргументы общего типа перед фактическим типом возврата, который иначе не может быть разрешен - см. [Здесь] (https://docs.oracle.com/javase/tutorial/extra /generics/methods.html). – Mena

2

Вы можете использовать один и тот же общий параметризированный типа в тип параметра и тип объекта возвращается:

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

После можно назвать так:

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

Работает очень хорошо спасибо много :) – akuma8

+0

приветствую :) – davidxxx