je pourrais venir avec encodages (supprimé les paramètres de type de simplification):
scala> :paste
// Entering paste mode (ctrl-D to finish)
def test0(a: A)(t : a.T) = a.test(t)
abstract class B{
val a: A
val t: a.T
def test = a.test(t)
}
// Exiting paste mode, now interpreting.
test0: (a: A)(t: a.T)Unit
defined class B
Ce d'autre part ne fonctionnait pas avec les classes de cas arguments (ni classes' pour cette question).
L'une des raisons pour lesquelles votre encodage ne fonctionnerait pas:
scala> def test1(a: A)(t : A#T) = a.test(t)
<console>:12: error: type mismatch;
found : t.type (with underlying type A#T)
required: a.T
def test1(a: A)(t : A#T) = a.test(t)
L'important est required: a.T
(contre A#T
). La méthode d'essai dans A
ne prend pas de T, il faut T this.T
, ou en d'autres termes, le T appartenant à un cas particulier de A.
Mais 'B [A2] (nouveau A3()," ")' ne compile pas si ... vouliez-vous dire que ce serait avec mon code? Sinon, votre solution est exactement ce dont j'avais besoin. – JbGi
Ha, un truc intelligent! Je ne savais pas qu'on peut utiliser le paramètre de type sur la vue de la main droite dans le raffinement. – Haspemulator
@JbGi Oui, j'ai beaucoup pensé comment le démontrer avec un exemple de compilation, mais le compilateur scala est assez restrictif ici. Alors gardons ceci juste un exemple imaginaire pour un compilateur imaginaire ressemblant à scala, qui pourrait compiler la source originale. – Odomontois