2013-01-24 1 views
0

.Gap dans le concept de commande implicite d'un type utilisé pour créer une collection

J'ai une classe

org.personal.exercises.LengthContentsPair (l: Int, c: String) 
{ 
    val length = l 
    val contents = c 

} 

Puis, dans le même fichier source, je définir également une valeur implicite qui définit la façon dont les objets de ce type est à commander, ainsi:

object LengthContentsPair { 

    implicit val lengthContentsPairOrdering = new Ordering [LengthContentsPair] { 

     def compare (a: LengthContentsPair, b: LengthContentsPair)= { 

      a.length compare b.length; 
     } 
    } 
} 

suite aux solutions données dans ce forum.

Maintenant, je veux créer un ensemble spécialisé qui limite le nombre d'éléments de l'ensemble à un nombre donné. Donc, je définis une classe séparée comme ceci:

import scala.collection.immutable.TreeSet; 

import org.personal.exercises.LengthContentsPair.lengthContentsPairOrdering; 

class FixedSizedSortedSet [LengthContentsPair] extends TreeSet [LengthContentsPair] 
{ .. 
} 

Pour moi, cela semble la bonne façon de sous-classe un TreeSet. Mais, le compilateur renvoie l'erreur suivante:

(1) No implicit Ordering defined for LengthContentsPair.

(2) not enough arguments for constructor TreeSet: (implicit ordering: Ordering[LengthContentsPair])scala.collection.immutable.TreeSet[LengthContentsPair]. Unspecified value parameter ordering.

Ai-je mal compris les règles de portée? C'est quelque chose de très facile que je ressens, mais je ne peux pas mettre la main dessus.

Répondre

1

Vous avez défini FixedSizedSortedSet incorrect. Votre implémentation a un paramètre de type générique nommé LengthContentsPair qui n'a rien à voir avec votre classe avec ce nom. En d'autres termes, vous avez ombré la classe LengthContentsPair avec un type générique.

Si vous avez besoin d'un ensemble spécialisé qui ne détient que des éléments de LengthContentsPair, vous vouliez probablement dire:

class FixedSizedSortedSet extends TreeSet[LengthContentsPair] 
{ .. 
} 

Cela devrait fonctionner si une instance de Ordering[LengthContentsPair] est visible. Mais cela ne devrait pas poser de problème, puisque l'ordre est défini dans l'objet compagnon LengthContentsPair et est visible comme paramètre implicite par défaut.

Mais si vous avez besoin plutôt une extension générique de TreeSet qui peut contenir des éléments de tout type, alors que vous vouliez dire probablement ceci:

class FixedSizedSortedSet[T](implicit ordering: Ordering[T]) extends TreeSet[T] 
{ .. 
} 

paramètre implicite est nécessaire parce que TreeSet exige une Ordering[T] implicite, donc nous devons transmettre cette exigence à FixedSizedSortedSet

BTW. Je vous suggère de remplacer votre classe LengthContentsPair par une case class.

+0

Gosh! Je me réprimande d'être aveugle à l'effet d'ombre. Comment pourrais-je manquer cela et passer au moins une heure à regarder le code. Merci beaucoup pour avoir remarqué. Et, oui, dans mon code source, LengthContentsPair est en effet une 'classe de cas' car j'ai beaucoup de matches à faire. – Nirmalya

Questions connexes