参数化类型的快捷方式?

时间:2019-01-25 18:22:55

标签: java generics parameterized generic-type-argument

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

我试图创建一个空的类la

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

但是采用List<Map<String,Object>>的方法不接受new ListMap()作为类型,如果我将它们分配给{{1} }。基本上,我希望Java将我的ListMap与List>相同,因为从理论上讲,至少是通过继承。

2 个答案:

答案 0 :(得分:1)

由于您有返回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());

答案 1 :(得分:0)

在这种情况下,最好的做法是在ListMap之间和List<Map<String, Object>>之间添加转换方法...知道您可以选择在受影响的地方实施ListMap如果您可以保留对原始List的引用并通过委派实现ListMap或将更改分开,则可以通过更改原始ListMap来扩展{{1 }}在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); } } } ,则使用上面的static方法可以保存实例化。