是否可以限制可以实现特征的类型?比方说,例如我有一个类型
interface Something {
void foo()
}
和特质
trait SomethingAbility {
void bar() {
println "bar"
}
}
是否有一种方法我只能允许类型为Something
的类实现特征,例如
// OK
class SomethingImpl implements Something, SomethingAbility {
void foo() {
println "foo"
}
}
// error: this class should not be allowed to implement the trait
// because it's not a Something
class NotSomething implements SomethingAbility {
void foo() {
println "foo"
}
}
一种选择是向特征添加抽象方法
trait SomethingAbility {
void bar() {
println "bar"
}
abstract void foo()
}
这意味着特性不能由类实现,除非该类还提供foo()
方法,但这与类{{{1}类不同。 1}}
答案 0 :(得分:9)
我认为你要找的是@Selftype,见http://docs.groovy-lang.org/docs/latest/html/gapi/groovy/transform/SelfType.html 基本上它说明了使用这个特性的类必须实现什么。所以用
@SelfType(Something)
trait SomethingAbility {
void bar() {
println "bar"
}
}
你声明,使用这个特性的任何类也必须实现Something接口。这样可以确保,例如,如果您静态编译特征并从接口Something调用方法,则该编译不会失败。当然对于标准的Groovy,这不是必需的,因为鸭子打字。