在下面的代码中,有一个DogSearcher,它有一个名为fetch的方法,期望一个Ball。我们也可以使用CatSearcher,它具有期望Bell的获取方法。我们的想法是,我们可以调用从PetSearcher继承的实例的提取并为其提供不同的参数。Scala - 调用上层实例的方法
任何想法我失踪?
trait PetSearcher {
def search(what: Thing): Unit = {
println("default searching")
}
}
class DogSearcher extends PetSearcher {
def search(what: Ball): Unit = {
println("dog searching")
}
}
trait Thing {
val name: String
}
case class Ball(name: String) extends Thing
class Pet {
def fetch[S <: PetSearcher, F <: Thing](searcher: S, what: F): Unit = {
println(what)
searcher.search(what)
}
}
class Dog extends Pet {
val searcher = new DogSearcher()
val ball = new Ball("red")
def go(): Unit = {
fetch[DogSearcher, Ball](searcher, ball)
}
}
//should use DogSearcher but calls fetch on Search, not on DogSearcher.
// So prints default searching, not dog searching..
new Dog().go()
有没有办法说'DogSearcher扩展了PetSearcher [Ball]',然后让'search'方法知道应该接受'Ball'而不手动添加'Ball'到方法签名?如果你有20种方法,你不想在每个地方都复制'Ball' –
我不这么认为,在scala中你必须给方法参数的类型。如果你想避免输入,一个好的IDE应该用IntelliJ和scala插件来帮助*覆盖*一个方法(例如,替换已经实现的特征)按下ctrl + o并选择方法 - 它将填充类型(包括在这种情况下类型是从参数派生的)。为了*实现*方法(即如果特征没有默认实现)按ctrl + i(这个快捷方式在实现特征时非常有用)。 –