Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
 Generics: вызвать конструктор класса <T>  [new]
Molasar
Member

Откуда:
Сообщений: 584
Всем привет!

Есть класс generic <T>:
1. Как в методе generateObjects() правильно создавать новые объекты <T>? new <T>(parameters) - ошибка
2. Как правильно перебрать объекты List<T> objectList через for () в методе run()? for (<T> obj : objectList) - ошибка

public class ObjectProducer<T> implements Runnable {
    
    private List<T> objectList;

    public ObjectProducer() {
        this.objectList = new ArrayList<>();
    }
    
    @Override
    public void run() {
        objectList = generateObjects();
        for (<T> obj : objectList) {
        
        }        
    }
    
    private List<T> generateObjects() {
        objectList.add(new <T>(parameters));
        
        return objectList;
    }

}
12 апр 19, 12:54    [21860443]     Ответить | Цитировать Сообщить модератору
 Re: Generics: вызвать конструктор класса <T>  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 5044
Molasar,
варианты:

-передать Class<T> и потом от newInstance();
-передать имя класс, потом создать класс по имени и опять newInstance()
-передать фабрику для создания нового экземляра класса
-сделать класс асбтрактным, сделать абстрактный методы createNew(); и потом в имплементациях таки реализовать его как хочешь
-в зависимости от вашей композиции классов можно использовать getGenericSuperclass()
12 апр 19, 13:07    [21860461]     Ответить | Цитировать Сообщить модератору
 Re: Generics: вызвать конструктор класса <T>  [new]
mayton
Member

Откуда: loopback
Сообщений: 39868
    @Override
    public void run() {
        objectList = generateObjects();
        for (T obj : objectList) {
        
        }        
    }
12 апр 19, 17:49    [21860748]     Ответить | Цитировать Сообщить модератору
 Re: Generics: вызвать конструктор класса <T>  [new]
betelgeizex
Member

Откуда:
Сообщений: 46
Molasar,

На второй вопрос коллега mayton дал ответ.

А на первый вопрос правильный ответ только один - никак Представьте, что тот самый тип 'T' - это интерфейс.

        ObjectProducer<Runnable> producer = new ObjectProducer<>();


Какой из всех возможных Runnable должен создать ваш метод generateObjects?

Коллега Озверин дал варианты, но думать нужно вам...
12 апр 19, 22:11    [21860913]     Ответить | Цитировать Сообщить модератору
 Re: Generics: вызвать конструктор класса <T>  [new]
mayton
Member

Откуда: loopback
Сообщений: 39868
    private List<T> generateObjects() {
        objectList.add(new <T>(parameters));
        
        return objectList;
    }


Смотрите... тут в первую очередь надо искать смыслы. Что хочет сделать автор? Что нужно бизнесу.
Разумеется шаблонизатор - это мощный механизм и на нем можно написать любую хрень которая
никогда не скомпилируется.

Но мы же с вами не обезяны. Мы - инженеры. Мы не должны играться кубиками и случайно складывать
из них решения! А потом приходить в форум и спрашивать почему оно так. Это не инженерный подход.

Нужно спросить. Что должен делаеть генерализованный метод generateObjects() ?
12 апр 19, 22:38    [21860929]     Ответить | Цитировать Сообщить модератору
Все форумы / Java Ответить