为了账号安全,请及时绑定邮箱和手机立即绑定

参数化类型的快捷方式?

参数化类型的快捷方式?

牧羊人nacy 2022-05-21 20:51:45
我正在使用需要生成大量代码的代码,List<Map<String,Object>>并且必须一直输入例如代码是很笨拙bob = new List<Map<String,Object>>的。我试图创建一个空类class ListMap extends List<Map<String,Object>> {}但是随后的方法List<Map<String,Object>>不接受 a作为它们的类型,如果我将它们分配给 a new ListMap(),我会从返回的方法中得到错误。基本上,我希望 Java 将我的 ListMap 视为与 List> 相同...因为理论上至少通过继承。List<Map<String,Object>>ListMap
查看完整描述

2 回答

?
慕桂英4014372

TA贡献1871条经验 获得超13个赞

在这种情况下,最好的做法是为您ListMap的往返添加转换方法List<Map<String, Object>>......知道如果您可以保留对它的引用并通过委托或将更改分开,在这种情况下,您可以共同扩展.ListMapListListMapListMapListjava.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.


查看完整回答
反对 回复 2022-05-21
?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

由于您有方法返回List<Map<String,Object>>,但想将其分配给类型的变量ListMap,并且List<Map<String,Object>>可能实现为 a ArrayList<Map<String,Object>>,因此您不能使其直接与 a 分配兼容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());


查看完整回答
反对 回复 2022-05-21
  • 2 回答
  • 0 关注
  • 80 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信