Le code suivant fonctionne correctementrapports Scala erreur si ne spécifie pas this.type lorsque vous utilisez la méthode de la chaîne en classe héritée
abstract class Base {
def append(value: Any): this.type = this
}
class Axis extends Base {
def text(value: String): this.type = append(value)
}
class XAxis extends Axis {
def position(value: Int): this.type = append(value)
}
def main(args: Array[String]): Unit = {
new XAxis().text("hello").position(0)
}
Alors que si je retire this.type dans Axis.text
class Axis extends Base {
// here we don't explicitly specify return type this.type
def text(value: String) = append(value)
}
Scala rapport
valeur
position
est pas membre deAxis
.
La chaîne appel de méthode
new XAxis().text
appelleraappend
append a le type de retour
this.type
this
est une instance deXAxis
.Alors
this.type
estAxis
Donc, peu importe si spécifier this.type
comme type de retour, Scala doit toujours être possible de déduire le type réel d'instance.
Pourquoi cela fonctionne-t-il lorsque nous spécifions explicitement le type de retour this.type
?
Mais cela ne fonctionne pas lorsque nous ne spécifions pas explicitement le type de retour this.type
?
Vous voulez dire que quand l'appel 'text', le compilateur le sait au moins est Axis, mais le compilateur n'essaiera pas de déduire le type réel? –
Oui. Mais notez que 'this.type' n'est jamais" égal "à' Axis' ou 'XAxis'. 'this.type' est un type singleton, ce qui signifie que la seule instance de ce type est l'objet courant. Dans votre premier exemple 'this.type' sera un sous-type de' XAxis', donc le compilateur sait qu'il a une méthode appelée 'position'. –
Le compilateur Scala a besoin d'informations pour inférer le type. pour la méthode 'text', la seule information dont il dispose est l'appel' append' qui a le type de retour 'this.type'. Comment interprète-t-on jamais un type singleton? Puisque le type singleton est ce que 'text' pourrait obtenir. –