Ho alcuni problemi con Scala per dedurre il tipo giusto da un tipo di proiezione.Come dedurre il giusto tipo di parametro da un tipo di proiezione?
Si consideri il seguente:
trait Foo {
type X
}
trait Bar extends Foo {
type X = String
}
def baz[F <: Foo](x: F#X): Unit = ???
Poi il seguente compila bene:
val x: Foo#X = ???
baz(x)
ma la seguente non verrà compilato:
val x: Bar#X = ???
baz(x)
Scala vede il "tipo String sottostante "per x
, ma ha perso le informazioni che x
è un Bar#X
. Funziona bene se io annotare il tipo:
baz[Bar](x)
C'è un modo per rendere Scala dedurre il parametro di tipo giusto per baz
?
In caso contrario, qual è la risposta generale che rende impossibile?
Non una risposta, ma vale la pena notare che se si digita 'x' utilizzando un designatore di tipo anziché una proiezione di tipo, funziona, ad esempio per es. 'oggetto BAR estende Bar; val x: BAR.X = "a"; Baz (x) '. –
Vale anche la pena notare: si può convincere il compilatore che si desidera veramente che 'x' venga digitato come qualcosa più o meno come' Bar # X' con l'incredibilmente brutto 'val x: bX forSome {val b: Bar} =" a ": bX forSome {val b: Bar}'. –
Sembra strano caso d'uso. Perchè vuoi fare questo? –