Как я могу создать Generi c метод в Java? - PullRequest
0 голосов
/ 01 мая 2020

У меня есть два условия в методе:

if(urlSendModel.isHasPhoto()) {
    ArrayList<InputMediaPhoto> inputMediaPhotos = new ArrayList<>();

    for(String photoUrl : urlSendModel.getPhotos()){
        inputMediaPhotos.add(new InputMediaPhoto(photoUrl));
    }

    SendMediaGroup sendMediaGroup = new SendMediaGroup(message.chat().id(),
            inputMediaPhotos.toArray(new InputMediaPhoto[0]));

    bot.execute(sendMediaGroup);
}
if(urlSendModel.isHasVideo()){
    ArrayList<InputMediaVideo> inputMediaVideos = new ArrayList<>();

    for(String videoUrl : urlSendModel.getVideos()){
        inputMediaVideos.add(new InputMediaVideo(videoUrl));
    }

    SendMediaGroup sendMediaGroup = new SendMediaGroup(message.chat().id(),
            inputMediaVideos.toArray(new InputMediaVideo[0]));

    bot.execute(sendMediaGroup);
}

Как мне создать нечто подобное или решить проблему другим способом.

private <T extends InputMedia<T>> void sendMedia(Message message, ArrayList<String> urls) {
    ArrayList<T> inputMedia = new ArrayList<>();

    for(String url : urls){
        inputMedia.add(new T(url));
    }

    SendMediaGroup sendMediaGroup = new SendMediaGroup(message.chat().id(),
        inputMedia.toArray(new T[0]));

    bot.execute(sendMediaGroup);
}

Я буду рад любое предложенное решение.

Ответы [ 2 ]

1 голос
/ 01 мая 2020

Оба требования здесь можно обойти, передав class в метод. Я пропущу дополнительные подробности о том, что делает ваш метод, но, например:

<T> void doSomething(final Class<T> klass, final int length) {
    // Replace 'new T[10]'
    final T[] array = Array.newInstance(klass, length);

    final Constructor<T> constructor = klass.getConstructor();
    for (int i = 0; i < length; i++) {
        // Replace 'new T()'
        array[i] = constructor.newInstance();
    }
}

  • Примечание 1. Замена new T() была предоставлена ​​ @ Vince Emigh .
  • Примечание 2: обработка Exception здесь не рассматривается, поэтому она не будет компилироваться как есть.
  • Примечание 3: Если вам нужно использовать Если конструктор отличается от конструктора без аргументов, то может быть проще принять Function<Object[], T>, который преобразует предоставленные вами аргументы в экземпляр типа.
0 голосов
/ 01 мая 2020

Вы можете сначала создать класс c:

public class ClassList<T extends Object>{ private ArrayList<T> list; .... }
// or
public class ClassList<T extends InputMedia>{ private ArrayList<T> list; .... }

, а затем использовать конструктор или установщик, чтобы повлиять на значение в вашем списке атрибутов T

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