2 つの特性があり、それぞれがそのメンバーの 1 つの型パラメーターを持ちます。最初のトレイトには、2 番目のトレイトのインスタンスと 2 番目のトレイトの型メンバーのインスタンスを受け取る関数があります。この関数は、その型メンバーのインスタンスを期待している 2 番目の特性の関数を呼び出します。ただし、これが実際に機能するように、呼び出しを適切にパラメーター化する方法がわかりません。失敗する簡単な例を次に示します。
trait Garage {
type CarType <: Car
def Cars: Seq[CarType]
def copy(Cars: Seq[CarType]): Garage
def Refuel(car: CarType, fuel: CarType#FuelType): Garage = {
val car_index = Cars.zipWithIndex.find(_._1 == car).get._2
copy(Cars.updated(car_index, car.Refuel(fuel)))
}
}
trait Car {
type FuelType <: Fuel
def Fuel: FuelType
def copy(Fuel: FuelType): Car
def Refuel(fuel: FuelType): Car = {
copy(fuel)
}
}
trait Fuel
これは次のエラーで失敗します。
error: type mismatch;
found : fuel.type (with underlying type Garage.this.CarType#FuelType)
required: car.FuelType
copy(Cars.updated(car_index, car.Refuel(fuel)))
^
そのタイプの に受け入れられる aおよび anyをGarage.Refuel
受け入れるように関数を制約するにはどうすればよいですか?Car
Fuel
Car