2017-07-10 8 views
0

J'apprends les fonctionnalités du langage Scala. Je déclare une classe avec un paramètre de type.Remplacer les fonctions génériques dans Scala Avec "la méthode xxx ne remplace rien" Erreur

class Pair[+T](val first: T, val second: T){ 
    // T is a covariant type. So an invariance R is introduced. 
    def replaceFirst[R >: T](newFirst: R) = { 
    new Pair(newFirst, second) 
    } 

    override def toString = "(" + first + ", " + second + ")" 
} 

classe Pair a une fonction générique replaceFirst. Je déclare une nouvelle classe NastyDoublePair qui s'étend Pair[Double]. Et je voudrais remplacer la fonction générique replaceFirst. Voici le compilez le code d'erreur:

class NastyDoublePair(first: Double, second: Double) extends Pair[Double](first, second){ 
    override def replaceFirst(newFirst: Double): Pair[Double] = { 
    new Pair[Double](newFirst, second) 
    } 
} 

L'erreur de compilation est inférieure

Ch17.scala:143: error: method replaceFirst overrides nothing. 
Note: the super classes of class NastyDoublePair contain the following, non final members named replaceFirst: 
def replaceFirst[R >: Double](newFirst: R): ch17.p9.Pair[R] 
      override def replaceFirst(newFirst: Double): Pair[Double] = { 
            ^

Cependant, si je change la fonction replaceFirst à

def replaceFirst(newFirst: T) = { 
    new Pair(newFirst, second) 
} 

en plus, changer le Pair[+T]-Pair[T]. Tout va bien.

Comment puis-je corriger l'erreur de compilation, même si je souhaite définir le paramètre de type T sur un type covariant. Sinon, il n'y a pas de solution à mon cas. Je dois utiliser un paramètre de type invariant, pas Pair[+T] mais Pair[T]

Merci de partager votre idée. Meilleurs vœux.

Répondre

2

Cela se produit parce que les paramètres de type changement dans NastyDoublePair, vous pouvez faire cette compilation comme suit:

class NastyDoublePair(first: Double, second: Double) extends Pair[Double](first, second){ 
    override def replaceFirst[R >: Double](newFirst: R) = { 
    new Pair(newFirst, second) 
    } 
} 
+0

Ceci est bien aussi longtemps que l'OP est satisfait d'une instance de 'Pair'. –