У меня есть некоторые проблемы с Scala, чтобы вывести правильный тип из проекции типа.
Рассмотрим следующее:
trait Foo {
type X
}
trait Bar extends Foo {
type X = String
}
def baz[F <: Foo](x: F#X): Unit = ???
Затем выполняются следующие компилирования:
val x: Foo#X = ???
baz(x)
Но следующее не будет компилироваться:
val x: Bar#X = ???
baz(x)
Scala видит "базовый тип String" для x
, но потерял информацию о том, что x
является Bar#X
. Он отлично работает, если я аннотирую тип:
baz[Bar](x)
Есть ли способ сделать Scala вывести правильный параметр типа для baz
?
Если нет, то каков общий ответ, который делает невозможным?