参数化类型的快捷方式?
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());
在这种情况下,最好的做法是在 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
.
,则使用上面的静态方法可以保存实例化
我正在处理需要生成大量 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());
在这种情况下,最好的做法是在 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
.