Пожалуйста, рассмотрите case class Foo[A, B <: list b ...> или что-то подобное. В частности,
A
, а также B
должны быть доступны где-то в теле Foo
.
Возможно ли, чтобы компилятор выводил A
автоматически? Например, Foo(List(1,2,3))
не работает, поскольку программа проверки типов выдает A
за Nothing
. Возможно, есть способ решить эту проблему с помощью членов типа?
У меня такое чувство, что я упускаю из виду что-то до ужаса простое ;)
EDIT: Я только что обнаружил, что использование другого параметра типа 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))
Может кто-нибудь объяснить мне это? Это проблема унификации?
EDIT 2: Использование [A, B[X] <: list b> может иметь нежелательные последствия для некоторых иерархий (хотя на самом деле это не очень важно). Что еще интереснее, я только что наткнулся на сообщение в блоге Джоша Суерета, которое неявно показывает, что
[A, B <: list b with> работает так же хорошо... Нет необходимости в имплицитах и т.д.