Ярлык для параметризованного типа? - PullRequest
0 голосов
/ 25 января 2019

Я работаю с кодом, где мне нужно сгенерировать много List<Map<String,Object>>, и неудобно набирать, например, например. bob = new List<Map<String,Object>> все время.

Я пытался создать пустой класс а-ля

class ListMap extends List<Map<String,Object>> {}

но тогда методы, которые принимают List<Map<String,Object>>, не принимают new ListMap() в качестве своего типа, и я получаю ошибки от методов, которые возвращают List<Map<String,Object>>, если я присваиваю их ListMap. По сути, я хочу, чтобы Java воспринимала мой ListMap так же, как List> ... потому что, по крайней мере, с помощью наследования, в теории.

Ответы [ 2 ]

0 голосов
/ 28 января 2019

В таком случае лучший способ действий - это добавить методы конвертации к вашему ListMap в List<Map<String, Object>> и ... * знать, что вы можете реализовать ListMap на расстоянии, что зависит от изменений в оригинале List, если вы можете сохранить ссылку на это и реализовать ListMap путем делегирования или оставить изменения разделенными, в этом случае вы можете сделать ListMap для расширения любой из List реализаций в java.util.*.

class ListMap extends AbstractList<Map<String, Object>> {

   public ListMap(final Map<String, Object> list) { super(list); } 
   // or
   public static ListMap fromList(final List<Map<String, Object>> list) {
       if (list instanceof ListMap) {
          return (ListMap) list;
       } else {
          return new ListMap(list);
       }
   } 
}

Использование статического метода, описанного выше, позволит вам сохранить экземпляр, если получится, что предоставленный список на самом деле ListMap.

0 голосов
/ 25 января 2019

Поскольку у вас есть методы, возвращающие List<Map<String,Object>>, но вы хотите присвоить их переменной типа ListMap, а List<Map<String,Object>> может быть реализован как ArrayList<Map<String,Object>>, вы не можете сделать его напрямую совместимым с назначением сListMap.

Итак, вам нужно обернуть возвращаемый объект делегирующим прокси.Сначала создайте общий делегирующий класс для List.Их легко создать, например, Eclipse может создать для вас все методы делегирования, выбрав «Generate Delegate Methods...» из выпадающего меню «Source».

Это должно выглядеть так:

public class DelegatingList<E> implements List<E> {
    private final List<E> list;
    protected DelegatingList(List<E> list) {
        this.list = list;
    }
    @Override
    public int size() {
        return this.list.size();
    }
    @Override
    public boolean isEmpty() {
        return this.list.isEmpty();
    }
    @Override
    public boolean contains(Object o) {
        return this.list.contains(o);
    }
    // many other delegating methods from List
}

Теперь определите ваш ListMap интерфейс:

public interface ListMap extends List<Map<String,Object>> {
    public static ListMap newArrayList() {
        return wrap(new ArrayList<>());
    }
    public static ListMap wrap(List<Map<String,Object>> list) {
        if (list instanceof ListMap)
            return (ListMap) list;
        class Wrapper extends DelegatingList<Map<String,Object>> implements ListMap {
            protected Wrapper() {
                super(list);
            }
        }
        return new Wrapper();
    }
}

Теперь его просто использовать:

ListMap myListMap = ListMap.newArrayList();
methodAcceptingListOfMapOfStringToObject(myListMap);
ListMap x = ListMap.wrap(methodReturningListOfMapOfStringToObject());
...