Récemment, j'ai joué avec la programmation au niveau du type à Scala, et a trouvé ce qui suit:Pourquoi ce code Scala se bloque si vous spécifiez type-paramètre?
trait NextPage[Curr, Next] {
def next : Next
}
class Foo
class Bar
class X(val year : Int)
object X {
implicit def xToNextPage[Y](x : X) : NextPage[X, Y] =
if (x.year == 2010) {
new X(x.year) with NextPage[X, Bar] {
def next = new Bar
}
}
else {
new X(x.year) with NextPage[X, Foo] {
def next = new Foo
}
}
}
val x = new X(2010)
val y = x.next //BOOM!
La dernière ligne se fige l'interprète indéfiniment. Ce qui est étrange, que si vous changez juste une ligne de code suivante:
implicit def xToNextPage[Y](x : X) : NextPage[X, Y] =
que
implicit def xToNextPage(x : X) : NextPage[X, _] =
calcul
sera effectué avec succès (mais le type résultant sera perdu, bien sûr).
Avez-vous une idée pourquoi c'est le cas? Je crois, que c'est lié à l'inférence de type en quelque sorte ...