У меня есть две черты, каждая из которых имеет параметр типа для одного из своих членов. В первом признаке у меня есть функция, которая принимает экземпляр второго признака и экземпляр элемента второго признака. Эта функция вызывает функцию во втором признаке, ожидающем этого экземпляра члена своего типа. Однако я не могу понять, как правильно параметризовать вызов, чтобы это действительно работало. Вот упрощенный пример того, что не удается:Scala: ограничение типа параметра на основе члена типа другого параметра
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)))
^
Как сдерживало функцию Garage.Refuel
так, что она принимает Car
и любой Fuel
, который является приемлемым для что тип Car
?
Это действительно работает. Я пытаюсь понять, что это даже делает с чертой. Я по-прежнему удивляюсь проблемам, которые могут быть исправлены в Scala, просто вставляя параметр ограниченного типа перед чем-то, а затем говоря, что вы можете вернуть этот тип. – drhagen
Кроме того, это намного лучший способ заменить данный элемент массива. – drhagen
Когда у вас есть такая рекурсия в ограничении, она называется [_F_-ограниченным полиморфизмом] (http://en.wikipedia.org/wiki/Bounded_quantification). –