Вопрос о дженериках Java - PullRequest
4 голосов
/ 11 мая 2011

Я пишу этот сервис запросов, который должен работать с несколькими предопределенными классами.Тем не менее, мне кажется избыточным, что при использовании этого класса обслуживания мне нужно передавать и тип класса, и объект класса, который он сам.Например, чтобы запросить объект «Контакт», мне потребуется предоставить оба файла и файл Contact.class, например:

lookupService = new MyLookupServiceImpl<Contact>(Contact.class);

В этом случае есть ли способ инициализировать класс без передачи »Contact.class "?Класс обслуживания выглядит следующим образом:

public class MyLookupServiceImpl<T> {
private Class<T> cls;

public MyLookupServiceImpl(Class<T> clz){
    this.cls = clz;
}

public T queryObject(String sql) {
    try {
        QueryResult result = ConnectionFactory.getConnection().query(sql);
        if(result.getSize()>0){
            T obj=null;
            MyObject sObj = result.getRecords()[0];
            MyObjectBuilder<T> ob = new MyObjectBuilder<T>(cls);
            obj = ob.buildORMObject(sObj);
            return obj;
        }
    } catch (ConnectionException e) {
        logger.warn(e.toString());
    }
    return null;
}
}

Любое предложение будет оценено.

Спасибо,

Ответы [ 3 ]

3 голосов
/ 11 мая 2011

Ответ НЕТ.В Java из-за стирания типа нет другого способа получить / получить эту информацию во время выполнения, кроме передачи информации о типе как Class<?> экземпляра.

0 голосов
/ 11 мая 2011

Бала верна (+1) к сожалению.Однако, если вы используете платформу Dependency Injection, например Guice , вы можете попросить Guice передать вам TypeLiteral того типа, который вас интересует. Вы можете сделать что-то вроде этого:1005 * Затем используйте Guice Injector, чтобы передать вам экземпляры MyLookupServiceImpl.Просто идея!:)

0 голосов
/ 11 мая 2011

Скорее всего, это необходимо, потому что невозможно создать новый экземпляр произвольного класса, указанного параметром типа;Другими словами, вы не можете сделать:

T obj = new T();

из-за способа реализации обобщений Java (с стиранием типа).

Обратите внимание, что в вашем коде cls передается MyObjectBuilder<T>, который, скорее всего, является объектом, создающим новые экземпляры T.MyObjectBuilder<T> использует отражение для создания нового экземпляра T, с таким выражением:

T obj = cls.newInstance();

См. Также: Создание нового экземпляра T в Java

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...