У меня есть следующая проблема, и я смущен тем, что происходит:
- У меня есть неявно определенный приоритет
- Я использую этот неявный приоритет, чтобы наложить привязку к контексту
- Я объявляю класс case с полем по умолчанию, значения которого покрываются привязкой к контексту.
- Я все еще получаю ошибку типа
Минимальный рабочий пример, отражающий фактический код, над которым я работаю. В основном мне нужен неявный приоритет в другой части моего кода:
// priority implicits
sealed trait Stringifier[T] {
def stringify(lst: List[T]): String
}
trait Int_Stringifier {
implicit object IntStringifier {
def stringify(lst: List[Int]): String = lst.toString()
}
}
object Double_Stringifier extends Int_Stringifier {
implicit object DoubleStringifier extends Stringifier[Double] {
def stringify(lst: List[Double]): String = lst.toString()
}
}
object Example extends App {
trait Animal[T0] {
def incrementAge(): Animal[T0]
}
case class Dog[T0: Stringifier]
(age: Int = 0, locations: List[T0] = List(1, 2, 3)) extends Animal[String] {
def incrementAge(): Dog[T0] = this.copy(age = age + 1)
}
}
val t = Dog(age = 100)
Я получаю ошибку несоответствия типа:
required List[T0]
found List[Int]
Что здесь происходит? Я рассудил, что, поскольку я создаю свои параметры по умолчанию в границах, тип должен совпадать. Я пропустил какой-то трюк, чтобы заставить эту работу работать?
implicitly[List[T0]]
и указать неявные значенияList[Int]
и т. д. Неявные значения стандартных типов, таких какList[...]
, действительно плохая идея. - person Dmytro Mitin   schedule 16.07.2020implicitly[List[T0]]
было хорошим решением, просто вы могли использовать его в качестве пластыря. Однако я не знал, что вы можете предоставить такие аргументы по умолчанию. Я удалил свой комментарий сейчас. - person user   schedule 16.07.2020