【问题标题】:Mixin empty interfaceMixin 空接口
【发布时间】:2014-11-09 23:46:50
【问题描述】:

有没有办法将一个空接口混入一个包装原始类型的 groovy 对象?我尝试的是:

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

错误是“groovy.lang.GroovyRuntimeException: No default constructor for class B!不能混入。”

【问题讨论】:

  • 据我了解,这不是混合在 Groovy 中的工作方式。 Groovy mixin 用于将静态 category 方法附加到类。它们根本不改变类的继承结构,也不在每个实例的基础上工作。 mixin 方法查找其参数(在本例中为B.class)的所有以调用类作为第一个参数的静态方法,并将这些方法转换为不带第一个参数的调用类的实例方法。
  • 在最新版本的 Groovy 中,如果您使用 @Category 注释类,则不必在类别类中使用静态方法,但无论如何它必须是具体的可实例化类。接口不行。因此有关缺少默认构造函数的错误消息。

标签: groovy metaprogramming mixins


【解决方案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

【讨论】:

    【解决方案2】:

    不,你不能那样做。您在那里显示的代码试图将接口混合到每个实例的元类中,这是您无法做到的。即使您尝试将接口混合到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)
    

    【讨论】:

    • 我需要一个标记接口来区分用户创建的布尔值和我的应用程序,所以我希望混合一个接口(在一个空类中混合工作正常,但似乎接口在概念上会更好方式)。根据您的说法,我知道没有办法制作既是布尔实例又可以说它也有 B 的代理?
    猜你喜欢
    • 2016-03-15
    • 1970-01-01
    • 2015-03-24
    • 1970-01-01
    • 2017-06-27
    • 1970-01-01
    • 2022-01-16
    • 2016-03-27
    • 2022-08-17
    相关资源
    最近更新 更多