2016-08-20 34 views
2

是否有可能纳入特质与方法,使用方法链实现类方法一起?这就要求性状返回的特定类型的实现类,而“本”变量不是那种类型的默认值。能Groovy的特质返回类型实现适用于方法链

喜欢的东西:

def withFilter(String filter){ 
    this.filter = filter 
    return (super.getClass())this 
} 

根据下面的后顶部的答案,它看起来是很容易实现与斯卡拉性状,但我不完全理解的语法。它看起来像它使用一个闭包,它定义了它的返回类型,但是在Groovy中可能是相同的?

Best practice to implement Scala trait which supports method chaining

+1

所以,它看起来像“本”实际上确实有实现类的类型,但我会关闭的IntelliJ智能感知,这似乎并没有认识到的,并当试图链接另一个方法后,它被强调为“无法解析符号”。但是,它的工作。我将与Intellij开一张票。 – solvingJ

回答

3

您可以使用泛型方法。

下面是一个例子

trait MyTrait<T extends MyTrait<T>> { 
    def filter 

    T withFilter(String filter) { 
     this.filter = filter 
     return (T) this 
    } 
} 

class MyClz implements MyTrait<MyClz> { 
    def clzMethod() {} 
} 

def clz = new MyClz() 
     .withFilter("hello") 
     .withFilter("another") 
     .clzMethod() 
+0

这是一个非常简洁,清晰,相关的答案。我能够采取所提出的解决方案,将其应用于我的场景,而且它工作正常。非常感谢!后续问题:什么是使第一线具体的好处:(>,而不是仅仅)我看到它的工作原理,如果我只让,但我敢肯定,有一个为你做了什么原因。 – solvingJ

+0

@JerryW。在这种特殊情况下的唯一原因是为了防止某些类型的错误,如'MyClz实现MyTrait ' – SerCe

相关问题