我有一个特点:
trait SomeTrait {
def makeLulz: Unit = println("lulwot")
}
我有一个方法的另一个特性:
trait SomeTraitAlgorithm {
def on[A >: SomeTrait](b: A): A
}
和我的对象扩展了SomeTraitAlgorithm
object AwesomeAlgorithm extends SomeTraitAlgorithm {
override def on[A >: SomeTrait](a: A): A = {
a.makeLulz // WOOAH, throws a compile error?
???
}
}
Isn' t A
是SomeTrait
的子类?为什么编译器不知道doSomething
?
答案 0 :(得分:3)
<:
而非>:
object AwesomeAlgorithm extends SomeTraitAlgorithm {
override def on[A <: SomeTrait](a: A): A = {
a.makeLulz // WOOAH, throws NO compile error!
???
}
}
答案 1 :(得分:3)
你想要的是一个上层类型的界限。上限(<:
)接受作为Type的子类的所有内容,而Lower-type bounds(>:
)仅接受超类型。因此,如果您想从子类访问方法,则需要
object AwesomeAlgorithm extends SomeTraitAlgorithm {
override def on[A <: SomeTrait](a: A): A = {
a.makeLulz //No compiler error, Yay!
}
}
查看Upper Type Bounds和Lower Type Bounds上的网页。
如果您来自Java世界并且熟悉Generic Wildcards如何在那里工作,您可以将它们视为上层类型? extends SomeTrait
和下层类型? super SomeTrait
。