Учитывая следующее:Параметры типа и тип алгебраических данных?
scala> sealed trait Parent
defined trait Parent
scala> case object Boy extends Parent
defined object Boy
scala> case object Girl extends Parent
defined object Girl
, а затем метод:
scala> def foo[A <: Parent](x: Parent): A = {
| if(true) Boy else Girl
| }
<console>:14: error: type mismatch;
found : Boy.type
required: A
if(true) Boy else Girl
^
<console>:14: error: type mismatch;
found : Girl.type
required: A
if(true) Boy else Girl
^
Во время компиляции, это не известно, что Boy
и Girl
являются единственными подклассы Parent, i.e. A
?
'Foo' не может возвращать' Ā', так что выбирается клиентом, наиболее конкретный тип возвращается в 'Parent'. Что бы вы ожидали от 'foo [Girl]'? – Lee
"из" Parent', то есть 'A'" - вот где ваша логика пошла не так. 'Parent' * не *' A'. Это супертип «А». – dcastro