以下のコードには、Ball を期待する fetch と呼ばれるメソッドを持つ DogSearcher があります。Bell を予期する fetch メソッドを持つ CatSearcher を使用することもできます。アイデアは、PetSearcher から継承するインスタンスで fetch を呼び出し、それに異なる引数を提供できるということです。
私が見逃しているものはありますか?
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()