2016-07-27 2 views
0

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 de Axis.

La chaîne appel de méthode

new XAxis().text appellera append

append a le type de retour this.type

this est une instance de XAxis.

Alors this.type est Axis

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?

Répondre

2

Lorsque vous ne spécifiez pas le type de retour d'une méthode, le compilateur le déduira. Plus spécifiquement, le compilateur déduira toujours le type le plus précis, mais jamais un type singleton (qui peut être reconnu par la notation value.type). Donc, dans ce cas, la méthode text sera déduite pour retourner quelque chose de type Axis, qui est le supertype le plus précis de this.type dans la classe Axis.

+0

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? –

+0

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'. –

+0

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. –