1

以下のコードには、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() 
4

2 に答える 2

2

引数の型が異なるため、DogSearch のメソッドは PetSearcher のメソッドをオーバーライドしません (はsearchPetSearcher用ですが、 DogSearcher 用です - extendsという事実は、関数呼び出しを同じにするのに十分ではありません)。searchwhatThingBallBallThing

PetSearcherの型を定義するための型パラメーターを取得し、whatこれをオーバーライドできます (キーワードが必要になるDogSearcherことに注意してください) 。override

trait PetSearcher[T] {
  def search(what: T): Unit = {
    println("default searching")
  }
}

class DogSearcher extends PetSearcher[Ball] {
  override def search(what: Ball): Unit = {
    println("dog searching")
  }
}

コンパイルするには、PetSearcher に型パラメーター F (この Pet が検索する Thing のサブタイプ) を追加して、Pet での PetSearcher の使用を更新する必要もあります。

def fetch[S <: PetSearcher[F], F <: Thing](searcher: S, what: F): Unit = {
于 2016-12-15T16:07:08.827 に答える
2

@JamesThornileyの回答の代わりに、search拡張するものを受け入れるように定義できますThing

trait PetSearcher {
    def search[T <: Thing](what: T): Unit = {
        println("default searching")
    }
}

class  DogSearcher extends PetSearcher {
    override def search[T <: Thing](what: T): Unit = {
        println("dog searching")
    }
}

これにより、必要に応じて出力dog searchingされます。

于 2016-12-15T16:11:43.000 に答える