Пожалуйста, рассмотрите case class Foo[A, B <: List[A]](l: B) { ... }
или что-то похожее.В частности, A
, а также B
должны быть доступны где-то в теле Foo
.
Возможно ли, чтобы компилятор выводил A
автоматически?Например, Foo(List(1,2,3))
завершается ошибкой, поскольку средство проверки типа выводит A
как Nothing
.Возможно, есть способ использовать члены типа для решения этой проблемы?
У меня есть определенное чувство, что я упускаю из виду нечто невероятно простое;)
РЕДАКТИРОВАТЬ: я только что узнал, что спараметр другого типа X
работает просто отлично, но я не понимаю, почему это так:
scala> case class Bar[A, B[X] <: List[X]](l: B[A])
defined class Bar
scala> Bar(List(1,2,3))
res11: Bar[Int,List] = Bar(List(1, 2, 3))
Может кто-нибудь объяснить мне это? Это проблема объединения?
РЕДАКТИРОВАТЬ 2: Использование [A, B[X] <: List[X]](l: B[A])
может иметь нежелательные последствия для определенных иерархий (хотя на самом деле это не имеет большого значения).Что еще интереснее, я только что наткнулся на сообщение в блоге Джоша Суерета, в котором неявно показано, что [A, B <: List[A]](l: B with List[A])
работает так же хорошо ... Нет необходимости в подтекстах и т. Д.