Вы должны смотреть на следующую строку как на две отдельные части, левую часть = и правую:
val oB: Option[B] = collectFirstOf(List(new A,new B))
Здесь вы ожидаете, что тип выражения collectFirstOf (значение r) должен выводиться из типа значения oB. Компилятор не может этого сделать. Вы должны сказать конкретно, какой тип вы ожидаете. Возьмем следующий пример:
val v: Long = 1 + 4
Тип выражения 1 + 4 — Int. Затем этот int преобразуется в Long. Компилятор не делает и не может сделать вывод, что вы хотите, чтобы 1 или 4 были длинными:
Итак, чтобы решить вашу проблему, вам нужно сообщить компилятору, какой тип вы ожидаете, иначе он предполагает java.lang.Object:
val oB = collectFirstOf[B](List(new A,new B))
Таким образом, манифест получает правильное назначение, и с миром все в порядке. Так почему же компилируется следующее:
val oB:Option[B] = collectFirstOfT(List(new A,new B))
oB: Option[B] = Some(A@10f3a9c)
на первый взгляд кажется, что это не должно работать, но работает. Это связано с тем, что collectFirstOfT на самом деле возвращает Option[Nothing], который можно безопасно преобразовать в Option[B]:
scala> val f = collectFirstOfT(List(new A,new B))
f: Option[Nothing] = Some(A@baecb8)
scala> f.asInstanceOf[Option[B]]
res4: Option[B] = Some(A@baecb8)
person
Matthew Farwell
schedule
12.04.2012