Пожалуйста, рассмотрите case class Foo[A, B <: List[A]](l: B) { ... }
или что-то похожее. В частности, A
, а также B
должны быть доступны где-то в теле Foo
.
Возможно ли, чтобы компилятор сделал вывод A
автоматически? Например, Foo(List(1,2,3))
терпит неудачу, так как проверка типа A
указана как Nothing
. Возможно, существует способ использования членов типа для решения этой проблемы?
У меня есть такое чувство, что я не замечаю что-то неприлично простое;)
EDIT: я только выяснил, что использование другого параметра X
работает просто отлично, но atm Я не понимаю, почему это так:
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])
может иметь нежелательные последствия для определенных иерархий (хотя это не очень важно). Более интересно, я просто наткнулся на сообщение в блоге от Josh Suereth, что неявно показывает, что [A, B <: List[A]](l: B with List[A])
работает так же хорошо... Нет необходимости в implicits и др.