Ярлык для параметризованного типа?

Я работаю с кодом, где мне нужно генерировать много 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 ответа

Решение

Так как у вас есть методы, возвращающие 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());

В таком случае лучший способ действий - это добавить методы конвертации к вашему 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,

Другие вопросы по тегам