Basic type inferral

Пожалуйста, рассмотрите 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> работает так же хорошо... Нет необходимости в имплицитах и т.д.

11
задан fotNelton 14 February 2012 в 06:35
поделиться