Данные классы Родитель и ребенок.Неявное разрешение с контравариантностью
scala> class Parent
defined class Parent
scala> class Child extends Parent
defined class Child
Определение implicits для Родителя и Ребенка
scala> implicit val a = new Parent
a: Parent = [email protected]
scala> implicit val b = new Child
b: Child = [email protected]
implicitly
Используйте, чтобы выяснить, какие неявные получает решен.
scala> implicitly[Child]
res1: Child = [email protected]
иллюстрации моего понимания:
Parent
|
Child -- implicit resolution gets the most specific, lowest sub-type
Теперь давайте использовать контравариантным типа.
scala> trait A[-T]
defined trait A
scala> case class Concrete[T]() extends A[T]
defined class Concrete
Затем определите класс родителя и ребенка.
scala> class Parent
defined class Parent
scala> class Kid extends Parent
defined class Kid
Создайте имплициты для них тоже.
scala> implicit val x = Concrete[Parent]
x: Concrete[Parent] = Concrete()
scala> implicit val y = Concrete[Kid]
y: Concrete[Kid] = Concrete()
scala> implicitly[A[Parent]]
res1: A[Parent] = Concrete()
scala> implicitly[A[Kid]]
<console>:21: error: ambiguous implicit values:
both value x of type => Concrete[Parent]
and value y of type => Concrete[Kid]
match expected type A[Kid]
implicitly[A[Kid]]
^
В первом примере (без контрвариации), Скал смог решить неявный Child
для implicitly[Parent]
. Мне кажется, что он выбирает самый низкий подтип.
Однако при использовании contravariance
поведение изменяется. Зачем?
Не могли бы вы сказать больше, почему неизменность Concrete вызывает такое поведение? –
Я добавил больше слов, упрощая 6.26.3 спецификации. (Упрощение, так что даже я могу это понять.) –
Спасибо! Поскольку я называю «неявно [A [Kid]]», я понимаю, что 'A [-T]' является базовым типом, который является контравариантным. Итак, как сделать контравариант 'Conrete' влияющим на неявное разрешение? [Еще раз спасибо] –