Como inferir o parâmetro de tipo correto de um tipo de projeção?
Eu tenho alguns problemas com Scala para inferir o tipo certo de uma projeção de tipo.
Considere o seguinte:
trait Foo {
type X
}
trait Bar extends Foo {
type X = String
}
def baz[F <: Foo](x: F#X): Unit = ???
Em seguida, o seguinte compila bem:
val x: Foo#X = ???
baz(x)
Mas o seguinte não compilará:
val x: Bar#X = ???
baz(x)
Scala vê o "tipo de string subjacente" parax
, mas perdeu a informação quex
é umBar#X
. Ele funciona bem se eu anotar o tipo:
baz[Bar](x)
Existe uma maneira de fazer o Scala inferir o parâmetro de tipo correto parabaz
?
Se não, qual é a resposta geral que torna impossível?