Метод принимает List <String>, должен возвращать ту же реализацию List <String> - PullRequest
0 голосов
/ 10 мая 2018

У меня есть метод, который должен принять любую реализацию List, создать newList той же реализации и вернуть newList.Я пытаюсь выяснить, как убедиться, что newList имеет ту же реализацию List, что и input.См. Прилагаемый код:

static List<String> get(List<String> input){
  // do some stuff
  List<String> newList = new (?????);
  // do some stuff with newList
  return newList;
}

Я могу перегрузить метод для ArrayList, LinkedList, Vector и т. Д., Но я хочу посмотреть, можно ли это сделать, не повторяя кучукод.

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Перегрузка метода - один из способов сделать это. если возможно , почему бы не позволить пользователю этого метода вместо этого указать тип списка?

то есть метод get теперь также потребляет Supplier<List<String>>:

static List<String> get(List<String> input, Supplier<List<String>> listSupplier){
        // do some stuff
        List<String> newList = listSupplier.get();
        // do some stuff with newList
        return newList;
}

Тогда можно сделать:

get(arrayList, ArrayList::new);
get(linkedList, LinkedList::new);
get(vector, Vector::new);
0 голосов
/ 10 мая 2018

Вы можете попробовать что-то вроде этого

static List<String> get(List<String> input){
  // do some stuff
  List<String> newList = (List<String>)input.getClass().newInstance();
  // do some stuff with newList
  return newList;
}

input.getClass() вернет фактический тип реализации во время выполнения.

Но это может не всегда работать:

  1. Реализация может иметь недоступный конструктор
  2. Может не быть конструкторов без аргументов
  3. Вам придется самостоятельно проанализировать все проблемы
  4. Множество возможных проблем с тем, что я естьне в курсе

В общем, не делайте этого.Не придерживайтесь реализации.

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