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