Mixin空接口

时间:2014-11-09 23:46:50

标签: groovy metaprogramming mixins

有没有办法将空接口混合到包装原始类型的groovy对象?我试过的是:

interface B{}
a = new Boolean(false)
b = a.metaClass.mixin(B.class)
assert b instanceof B 

错误是“groovy.lang.GroovyRuntimeException:没有B类的默认构造函数!无法混入。”

2 个答案:

答案 0 :(得分:1)

不,你不能这样做。您在那里展示的代码试图将接口混合到每个实例的metaClass中,这是您无法做到的。即使您尝试将界面混合到Boolean.metaClass中,也不能执行此操作,而不是您尝试使用的特定于实例的metaClass

即使你能做到这一点,这个具体的例子没有任何意义,因为没有任何好处,所以我希望你可能提供了一个过分简化的例子来说明你真正想做的事情。根据具体情况,您可以通过生成代理来逃脱。你可以这样做......

interface B{}
a = new Boolean(false)

result = a as B

assert result instanceof B

// Boolean impements Serializable and Comparable
// so the proxy does too...
assert result instanceof Serializable
assert result instanceof Comparable

// the proxy is NOT a Boolean...
assert !(result instanceof Boolean)

答案 1 :(得分:1)

这不是您问题的直接答案,但如果您只想标记特定的Boolean个实例,您是否可以使用标记属性而不是界面?例如:

Boolean.metaClass.marked = false // establish the marker property

mb = new Boolean(false)
mb.marked = true

ub = new Boolean(false)

assert mb.marked
assert ub.marked == false
相关问题