我正在使用需要生成大量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>相同,因为从理论上讲,至少是通过继承。
答案 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方法可以保存实例化。