2013-05-06 5 views
0

Essayer quelque chose de graphique de base dans Scala et rencontré quelque chose que je pense que la communauté SO peut aider.Classes de sous-classes qui ont des paramètres de type

Premier. J'ai un trait graphique défini

trait GraphLike[T] { ... } 

et une sous-classe

class DiGraph[T] extends GraphLike[T] { ... } 

J'ai aussi une classe algorithme de parcours en largeur qui ressemble à ceci:

class BreadthFirstSearch[ T ](val graph: GraphLike[T], val sourceVertex: T) extends Graphsearch.GraphSearch[ T ]{ 

Je suis en train d'utiliser cette dans une autre classe qui ressemble à ceci:

class SAP[T](val graph: DiGraph[T]) { 

    class inSap[T](val v: T, val w: T) 
    { 
    val bfsV = new BreadthFirstSearch[T](graph, v) 
    } 
} 

Je rencontre une erreur de compilateur lorsque j'appelle BreadthFirstSearch. BreadthFirstSearch prend un paramètre GraphLike. La classe SAP a un graphe: DiGraph [T] et DiGraph est une sous-classe de GraphLike, donc je m'attendrais à pouvoir appeler le constructeur de BreadthFirstSearch en utilisant un paramètre graphique de type DiGraph car DiGraph est GraphLike.

Cependant, le compilateur dit ceci:

type mismatch; found : com.KGraph.DiGraph[T(in class SAP)] required: com.KGraph.GraphLike[T(in class 
inSap)] 

Son ne me plaît pas en utilisant la sous-classe DIGRAMME en place d'un GraphLike. Une idée de comment cela a-t-il pu arriver? Je devine que cela peut avoir à faire avec les paramètres de type. Toutes les classes sont invariantes sur le paramètre type. Je ne pensais pas autre chose que les définitions de constructeur de classe étaient nécessaires pour aider à cela, cependant, si plus de code est nécessaire pour comprendre les choses, s'il vous plaît mettre à jour et je vais fournir le code.

Répondre

3

Lorsque vous avez défini votre classe interne:

class inSap[T](val v: T, val w: T) 

Vous avez introduit une deuxième variable de type nommé T. Donc, quand vous appelez new BreadthFirstSearch[T] qui utilise le T de inSap, pas le T de SAP. Vous devez simplement supprimer le paramètre de type inSap, de sorte qu'à l'intérieur de cette classe, T se réfère simplement au type dans la portée externe.

+0

wow ... noob ...: P .... merci beaucoup pour l'aide ... –

Questions connexes