参数化类型的快捷方式?

Shortcut for parameterized type?

我正在处理需要生成大量 List<Map<String,Object>> 的代码,并且必须输入例如bob = new List<Map<String,Object>>一直。

我试图创建一个空的 class a la

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

但是采用 List<Map<String,Object>> 的方法不接受 new ListMap() 作为它们的类型,如果我分配它们,我会从 return List<Map<String,Object>> 的方法中得到错误到 ListMap。基本上,我希望 Java 将我的 ListMap 视为与 List> 相同的......因为理论上至少通过继承是这样。

由于您有返回 List<Map<String,Object>> 的方法,但想将其分配给 ListMap 类型的变量,并且 List<Map<String,Object>> 可能会实现为 ArrayList<Map<String,Object>>,你不能让它直接赋值兼容 ListMap.

因此,您需要使用委托代理包装返回的对象。首先,为 List 创建一个通用委托 class。它们很容易创建,例如Eclipse 可以通过从“Source”下拉菜单中选择“Generate Delegate Methods...”来为您创建所有委托方法。

它应该是这样的:

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());

在这种情况下,最好的做法是在 ListMapList<Map<String, Object>> 之间添加转换方法...知道您可以选择实施 ListMap受原始 List 中更改的影响,如果您可以保留对它的引用并通过委托实施 ListMap 或将更改分开,在这种情况下您可以共同 ListMap 扩展任何 Listjava.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.

,则使用上面的静态方法可以保存实例化