Groovy@Mixin中的“returnthis”类型

Groovy@Mixin中的“returnthis”类型,groovy,mixins,Groovy,Mixins,我有一个mixin类,它为不同的类型绑定了功能,这些类型不共享一个共同的遗产。混合是使用@Mixin注释应用的,因此它是在编译时处理的 一些mixin方法将此作为方法调用的结果返回。问题是这是混合类型,而不是基类的类型。当我想在应用程序的其余部分使用类型时,会抛出一个ClassCastException,表示不能将混合类型转换为基类型 在下面的示例代码中,return返回一个AMixin类型的对象,而不是BaseClass类型的对象 我怎样才能返回一个BaseClass类型的对象而不是AMixi

我有一个mixin类,它为不同的类型绑定了功能,这些类型不共享一个共同的遗产。混合是使用@Mixin注释应用的,因此它是在编译时处理的

一些mixin方法将此作为方法调用的结果返回。问题是这是混合类型,而不是基类的类型。当我想在应用程序的其余部分使用类型时,会抛出一个ClassCastException,表示不能将混合类型转换为基类型

在下面的示例代码中,return返回一个AMixin类型的对象,而不是BaseClass类型的对象

我怎样才能返回一个BaseClass类型的对象而不是AMixin类型的对象

class AMixin {

  def getWhatIWant(){
    if(isWhatIwant){
      return this
    } else {
      getChildWhatIWant()
    }
  }

  def getChildWhatIWant(){
    for (def child in childred) {
        def whatIWant = child.getWhatIWant()
        if (whatIWant) {
            return whatIWant
        }
    }
    return null
  }
}


@Mixin(AMixin)
class BaseClass {
  boolean isWhatiWant
  List<baseClass> children
}

我创建了基类,将类别添加到AMixin类中,基类从基类扩展而来

在GroovyConsole中执行此操作

BaseClass@39c931fb

class Base {
     boolean isWhatIwant
     List<BaseClass> children
}

@Category(Base)
class AMixin {

  def getWhatIWant(){
    if(isWhatIwant){
      return this
    } else {
      getChildWhatIWant()
    }
  }

  def getChildWhatIWant(){
    for (def child in children) {
        def whatIWant = child.getWhatIWant()
        if (whatIWant) {
            return whatIWant
        }
    }
    return null
  }
}


@Mixin(AMixin)
public class BaseClass extends Base {

}

def b = new BaseClass(isWhatIwant:true)
println b.getWhatIWant()
编辑一个DummyClass。我知道这是非常尴尬的工作…我肯定可以回答这是如何工作的

class DummyClass {

}

@Category(DummyClass)
class AMixin {

  def getWhatIWant(){
    if(isWhatIwant){
      return this
    } else {
      getChildWhatIWant()
    }
  }

  def getChildWhatIWant(){
    for (def child in children) {
        def whatIWant = child.getWhatIWant()
        if (whatIWant) {
            return whatIWant
        }
    }
    return null
  }
}


@Mixin(AMixin)
public class BaseClass extends DummyClass {
     boolean isWhatIwant
     List<BaseClass> children
}

def b = new BaseClass(isWhatIwant:true)
println b.getWhatIWant()

我只是遇到了同样的情况。我通过将concrete类中的'this'设置为concrete类中的私有变量'me'并在Mixin类中返回'me'来解决这个问题。例如:

class MyMixin {
    def mixinMethod() {
        // do stuff
        return me
    }
}

@Mixin(MyMixin)
class MyConcreteClass {
    private MyConcreteClass me
    MyConcreteClass() {
        me = this
    }
}

我觉得这有点笨拙,但我认为它比其他解决方案简单得多。我个人需要在多个类中使用同一个Mixin的能力,如果不能将多个类别分配给一个Mixin类,那么另一个建议的解决方案似乎不允许这样做。

@CategoryBase注释对Mixin类有什么影响?我假设如果我有多个基类,比如BaseA、BaseB和BaseC,这是不可能的。不,在Mixin中不能有多个类别基类,但可以有多个具有相同类别的Mixin,这有助于实现某种多层次结构@Category在groovy中用于元编程和扩展类。但是为什么我要用基类作为Category来扩展AMixin类呢?我只需要在基类中提供AMixin功能。这有点冗余,但是通过@Category属性,您告诉AMixin类它将使用该对象,并且只能混合/扩展该类对象。我不是groovy的大师,不知道元编程在幕后是如何工作的……我只是想回答你的问题……:我只是将该类作为虚拟类来编辑答案,并将所有内容保留在基类中。此解决方案有效,谢谢。因为我的Mixin必须被初始化,所以我选择用this调用这个方法initthis,这样我就可以通过这种方式将真正的this传递给Mixin,这对我来说似乎有点干净。然而,这两种变通方法都有不正确的地方,它们不应该是必要的。这种方法解决了我的问题,但正如Ice09已经说的,这种变通方法感觉不正确。