sto cercando di capire il motivo per cui il compilatore Scala non può dedurre la seguente limitazione su un tipo dipendente dal percorso:Scala - Bassa inferenza rilegato in tipi dipendenti dal percorso
trait MyTrait
class MyTraitImpl extends MyTrait
trait MyTrait2[A <: MyTrait] {
type MyTraitType = A
}
class MyTrait2Impl[A <: MyTrait] extends MyTrait2[A]
val obj: MyTrait2[_] = new MyTrait2Impl[MyTraitImpl]
def myMethod[A <: MyTrait](t2: MyTrait2[A]) = println("Hi!")
myMethod[obj.MyTraitType](obj)
// <console>:14: error: type arguments [obj.MyTraitType] do not conform to method myMethod's type parameter bounds [A <: MyTrait]
// myMethod[obj.MyTraitType](obj)
Per me, intuitivamente, MyTraitType
non può essere nient'altro che una sottoclasse di MyTrait
, poiché il limite è a destra su A
in MyTrait2
. Se c'è, puoi darmi un esempio o indicarmi dove questo snippet di codice è sbagliato?
Se questa è una limitazione del compilatore Scala, qualcuno può mostrarmi un modo per ottenere ciò utilizzando il sistema di tipi? Si noti che:
- non ho un oggetto
MyTrait
, némyMethod
ricevere uno; - Non ho bisogno di
myMethod
per conoscere il tipo di calcestruzzoA
; tutto ciò che deve sapere è cheA
è un sottotipo diMyTrait
e chet2
è parametrizzato suA
; - Il trattino di sottolineatura in
obj
è intenzionale; dove chiamomyMethod
, non conosco il tipo concreto diA
(altrimenti non sarebbe un problema); - Preferisco le soluzioni in cui non è necessario modificare
myMethod
.
In questo modo funziona davvero, ma è una specie di soluzione alternativa per il trattino basso nella domanda originale.Nella tua soluzione, la chiamata funziona perché il compilatore conosce il tipo concreto 'A' in' obj', mentre nel mio esempio l'ho soppresso esplicitamente. Immaginiamo ora di avere un 'List [MyTrait2]' e voglio chiamare 'myMethod' con uno degli elementi; non funzionerà con entrambe le soluzioni. Tuttavia, nella mia mente, penso che dovrebbe, dato che ci sono limiti concreti ('<: MyTrait') su quali tipi possono' A' prendere. –
@RuiGoncalves: la mia soluzione funziona con 'List [MyTrait2]' bene. – senia
@ RuiGonçalves: ho aggiunto la prova alla mia risposta, vedere l'aggiornamento. – senia