首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >将实现接口的Groovy映射转换回映射

将实现接口的Groovy映射转换回映射
EN

Stack Overflow用户
提问于 2012-02-28 19:20:27
回答 2查看 964关注 0票数 3

在Groovy中使用闭包映射实现接口(就像在http://groovy.codehaus.org/Groovy+way+to+implement+interfaces中一样)时,在使用as关键字或asType方法实现接口之后,有没有办法将对象转换回映射?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-29 22:50:12

根据您的用例,在将其转换为所需的接口之前,您似乎可以只保留对原始Map的引用。

但是,查看将Map对象转换为接口(使用Proxy)的源代码,似乎可以通过获取InvocationHandler的委托来重新检索原始映射。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def i = 1
def m = [ hasNext:{ true }, next:{ i++ } ]
Iterator iter = m as Iterator

def d = java.lang.reflect.Proxy.getInvocationHandler(iter).delegate
assert d.is(m)

注意:这取决于Groovy代码的内部结构,因此使用风险自负:

票数 6
EN

Stack Overflow用户

发布于 2012-02-28 19:58:12

有趣的问题..。简而言之,不是。答案很长,也许...假设你有这样的东西:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def i = 1
Iterator iter = [ hasNext:{ true }, next:{ i++ } ] as Iterator

然后调用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
println iter.take( 3 ).collect()

打印[1,2,3]

现在,您可以声明一个方法来完成此操作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def mapFromInterface( Object o, Class... clz ) {
  // Get a Set of all methods across the array of classes clz
  Set methods = clz*.methods.flatten()
  // Then, for each of these
  methods.collectEntries {
    // create a map entry with the name of the method as the key
    // and a closure which invokes the method as a value
    [ (it.name): { Object... args ->
                   o.metaClass.pickMethod( it.name, it.parameterTypes ).invoke( o, args )
    } ]
  }
}

然后,您可以执行以下操作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def map = mapFromInterface( iter, Iterator )

和呼叫:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
println map.next()
println map.next()

将先打印4,然后再打印5

使用println map打印地图的结果如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[ remove:ConsoleScript43$_mapFromInterface_closure3_closure4@57752bea,
  hasNext:ConsoleScript43$_mapFromInterface_closure3_closure4@4d963c81,
  next:ConsoleScript43$_mapFromInterface_closure3_closure4@425e60f2 ]

然而,因为这是一个映射,任何包含多个同名不同参数的方法的类都会失败。我也不确定在第一种情况下这样做是否明智……

出于兴趣,你的用例是什么?

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9488277

复制
相关文章
Hibernate之集合映射的使用(Set集合映射,list集合映射,Map集合映射)
别先生
2018/01/02
2.8K0
Hibernate之集合映射的使用(Set集合映射,list集合映射,Map集合映射)
MyBaits —— 通过调用接口映射sql语句
1、编写mapper接口 public interface EmployeeMapper { public Employee getEmpById(Integer id); } 2、编写sql
桑鱼
2020/03/18
5470
什么是映射?如何清晰的理解映射?
我们在计算机科学和数学里经常用到映射概念,这里打个比方就容易理解了 不废话 直接作出最直白的解释 : 生活里存在大量的对应 : 比如一个人的身份证号对应一个人 一张电影票对应一个人  一个丈夫配一个妻子 或者一个丈夫配多个妻子??!!(对,就是你脑补的那些画面) 说白了 映射就是一种特殊的对应关系 生活里 一箭射一只鸟 多箭射一只鸟 一箭射多只鸟 映射里 每一箭必须射到鸟 还不能一箭射多只鸟 对的 就跟你这个单身狗一样 家里催着你必须结婚 还只能结一个 在计算机科学里就相应的这么理解: 映射就是将两个对象对
kirin
2020/08/19
2.2K0
如何使用Hibernate映射文件将Java类映射到数据库表
上述示例中,<class>元素定义了Employee类和Department类与数据库表的映射关系,<id>元素定义了主键字段的映射,<property>元素定义了普通字段的映射,<many-to-one>元素定义了多对一关系的映射。
堕落飞鸟
2023/05/15
1.1K0
ElasticSearch 动态映射与静态映射
松哥原创的 Spring Boot 视频教程已经杀青,感兴趣的小伙伴戳这里-->Spring Boot+Vue+微人事视频教程
江南一点雨
2020/11/26
2.8K0
ElasticSearch 动态映射与静态映射
MyBatis 数组映射 与 集合映射
Integer addApiRequestParam(List<ApiRequestParam> apiRequestParam); <insert id="addApiRequestParam" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="groupID"> INSERT INTO eo_api_request_param(paramName,paramKey,paramKeyAl
红目香薰
2022/11/28
1.4K0
XStream将XML映射到对对象
该文介绍了如何利用XStream框架对XML文件进行解析和处理,并基于此框架实现一个简单的Java对象序列化和反序列化程序。
用户1171305
2017/12/28
9400
TypeScript系列教程九《类型转换》-- 映射类型
在这个例子里,OptionsFlags将会把Type所有的属性当做key,所有的值类型变成boolean
星宇大前端
2021/08/20
1.3K0
通过cycler实现属性的自动映射
在matplotlib中,默认存在一个颜色 的自动映射机制,当我们绘制多条直线时,会通过这个颜色映射机制来为每条直线赋予不同的颜色,代码如下
生信修炼手册
2020/09/14
6570
dockerfile 端口映射_docker 映射端口
HDIS-Framework是一个基于SpringBoot、Kubernetes、阿里云服务,编写的一个用于支撑微服务的极速开发框架。
全栈程序员站长
2022/11/02
7.6K0
dockerfile 端口映射_docker 映射端口
TS 类型体操:索引类型的映射再映射
TypeScript 给 JavaScript 加了套静态类型系统。其中,JavaScript 中的数组、对象等聚合多个元素的类型在 TypeScript 中对应的是索引类型。
神说要有光zxg
2022/03/03
9950
TS 类型体操:索引类型的映射再映射
将DataEase的doris端口映射的宿主机
编辑/opt/dataease/docker-compose-doris.yml 添加: ports: - 9030:9030 - 8030:8030 如图:
范一刀
2022/01/06
8860
将DataEase的doris端口映射的宿主机
js自己实现map映射的原理
Array.prototype.mymap=function(callback){ //this指向的是当前对象st var arr=this; var list=[]; for(var i=0;i<arr.length;i++){ list[i]=callback(arr[i],i,arr); } return list; } var st=[1,2,3,4,5]
IT工作者
2022/05/13
5.4K0
坐标映射
建立等参单元,需要另外一个自然坐标系下的参考单元。对于物理坐标系下的任意一点,在自然坐标系下的参考单元中,有唯一的一个点与之对应;反过来对于自然坐标系下参考单元的任意一点,在物理坐标系下的单元中,有唯
fem178
2018/04/08
2.3K0
坐标映射
网格映射
对于两个网格S和T,它们之间的映射F:S -> T,可以根据根据S和T的相似度来进行分类:
NT4.4
2019/10/24
1.6K0
网格映射
HashMap实现多层级关系映射
让我们先看第一层 map,即可将父 - 子节点的映射关系建立,如果没有父节点的设为 root 为父.,即为顶级节点.
JavaEdge
2020/05/27
7670
HashMap实现多层级关系映射
js映射
const resultData = new Map() //添加键值对 set resultData.set('average', 1.6) resultData.set('lastResult', null) const person = { name: 'John', age: 34 } resultData.set(person, 1.24) //for循环 for (const el of resultData) { console.log(el) } //key相同情况 resul
贵哥的编程之路
2021/04/08
1K0
mapstate映射数组名(逆映射)
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/129536.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/29
9560
mapstate映射数组名(逆映射)
Hibernate @Transient实现临时字段映射
Hibernate @Transient实现临时字段映射
程裕强
2018/01/02
1.2K0
Java内存映射原理与实现
“映射”就是建立一种对应关系,主要是指硬盘上文件的位置与进程逻辑地址空间中一块相同区域之间一一对应。这种关系纯属是逻辑上的概念,物理上是不存在的,原因是进程的逻辑地址空间本身就是不存在的,在内存映射过程中,并没有实际的数据拷贝,文件没有被载入内存,只是逻辑上放入了内存,具体到代码,就是建立并初始化了相关的数据结构,这个过程有系统调用mmap()实现,所以映射的效率很高。
全栈程序员站长
2022/09/10
7620
Java内存映射原理与实现

相似问题

groovy:使用compileStatic将接口实现列表转换为映射

116

转换Groovy映射

10

将集合转换为映射groovy

20

将接口{}转换为映射

10

MongoDB:将接口映射到实现

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文