【发布时间】:2013-10-31 08:49:24
【问题描述】:
我想创建一些实用方法,并且我希望它能够在不同的对象上工作,只要它们可以提供可读/写的 Integer 属性。
我知道“标准”方式是:
- 声明一些接口
IProvidesAccessToInteger具有setInteger和getInteger。 - 声明
MyUtility.doSomethingWonderful(IProvidesAccessToInteger obj) - 致电
obj.setInteger和obj.getInteger。
但这有一个非常严重的缺点,它需要我希望 MyUtility 与之合作的所有班级的合作,不仅如此,即使某些班级想要合作 MyUtility 仍然只能@ 987654329@ 到该类的单个预定字段。
我正在寻找一些语法,它允许像MyUtility.doSomethingWonderful(T obj, Method<Integer> getter, Method<Integer,Integer> setter) 这样的东西,可能以某种方式使用泛型来指定obj 有两个方法的要求,这些方法可以设置并设置一个 Integer 并有一些方法可以在实例上调用它们obj.
用不需要对象的静态方法做类似的事情也可能很有趣。
更新: 当我提到反射时,我想澄清一下,我知道可以使用反射来完成密切的事情。
但是,由于我不需要在运行时解析实际接口,我希望 JAVA 有某种方式来指定某种“接口实现映射”,这样如果我的要求是一个具有两种方法的对象@ 987654333@ 和 void ?(int) 我可以指定类似.doSomethingWonderful(?<int getter(),void setter(int)> obj) 的内容,并使用具有int getInt() 和void setInt(int) 的某个object1 调用它一次,然后使用具有int getIntValue() 和void setIntValue(int) 的其他object2 调用一次,方法是在调用中指定即object 满足getInteger 的要求getInt 满足setInteger 的要求setInt 等等。可能使用像 `.doSomethingWonderful((?)object1)
至少在理论上,我认为应该可以在编译时完成所有操作,并且不需要任何运行时反射。
也许这个名字的正确名称应该是匿名接口。
也就是说,我接受通过反射的运行时解决方案也可能是一种解决方案。
【问题讨论】:
-
你刚刚描述了反射。现在谷歌它并阅读!
-
我知道什么是反射,但我不是在寻找在 RUNTIME 解决 getter 和 setter 的能力,所以我(希望)寻找一种更具声明性(和类型安全)的方法来做到这一点。
-
不,我认为 (1) 使用接口(你说你不想这样做)和 (2) Boris 的出色解决方案确实是你唯一的选择。
标签: java generics methods delegates