Этот вопрос закрыт для ответов, так как повторяет вопрос Класс Generic, массив типов, как вызвать обработку массива методом типа?

Generic класс, массив типов, как вызвать обработку массива методом типа?

Есть интерфейс
interface IEvents{
    void onDeviceChange(int Int);
    void onDeviceAdd(int index);
}

Мне нужно сделать вызовы метода по списку.
Как я представляю это:

class Subs<T>{
    private ArrayList<T> list = new ArrayList<>();
    void callAll(){
        for (int i = 0; i<list.size();i++){
            list.get(i){метод который я вызываю через класс}
        }
    }
}

Subs<IEvents> events = new Subs<>();
//Наполняем массив
//....
events.onDeviceChange(1) // вызывается функция callAll и проходится по массиву методом onDeviceChange
//...
events.onDeviceAdd(1) // вызывается функция callAll и проходится по массиву методом onDeviceAdd

Есть ли возможность написать такой универсальный класс ?
  • Вопрос задан
  • 155 просмотров
Пригласить эксперта
Ответы на вопрос 2
Vamp
@Vamp
Не получится сделать конкретно так. Это не PHP, у которого подобные вызовы можно перехватить магическим методом __call(). В java вызываемый метод должен существовать в классе.

Максимально похоже можно сделать через лямбды:

class Subs<T>{
    private ArrayList<T> list = new ArrayList<>();
   
    void callAll(Consumer<T> consumer) {
        for (T element : list){
            consumer.accept(element);
        }
    }
}

Subs<IEvents> events = new Subs<>();
events.callAll(e -> e.onDeviceChange(1));
events.callAll(e -> e.onDeviceAdd(1));


Или же прямо через коллекцию:

ArrayList<IEvents> list = new ArrayList<>();
list.forEach(e -> e.onDeviceChange(1));
list.forEach(e -> e.onDeviceAdd(1));
Ответ написан
SilenceOfWinter
@SilenceOfWinter
та еще зажигалка...
Не надо так делать, реализуй шаблон Strategy
Ответ написан
Ваш ответ на вопрос

Вопрос закрыт для ответов и комментариев

Потому что уже есть похожий вопрос.
Похожие вопросы