2010-10-05 8 views
0

Je crée une liste contenant Comparable objets et souhaite créer un objet qui sert de minimum de la liste, de sorte qu'il retourne toujours -1 pour sa méthode compareTo. D'autres méthodes dans la liste, comme print ici nécessite une entrée de type A. Si je compile le code que je reçois l'erreur suivante:Scala incompatibilité de type de classe anonyme

error: type mismatch; 
found : java.lang.Object with java.lang.Comparable[String] 
required: String 
l.print(l.min) 

Quelqu'un a une idée de comment un créer un tel élément minimum de façon à est toujours plus petit que tous les autres éléments de la liste?

class MyList[A <: Comparable[A]] { 
    val min = new Comparable[A] { 
    def compareTo(other: A) = -1 
    } 

    def print(a: A) = { 
    println(a) 
    } 
} 

class Run extends Application { 
    val l = new MyList[String] 
    l.print(l.min) 
} 

Répondre

2

Eh bien, l'entrée transmise n'est pas égale à l'entrée fournie, n'est-ce pas? print a besoin d'un A:

def print(a: A) = { 

Et min ne retourne pas A:

val min = new Comparable[A] { 

Quant à la création d'un tel A que vous voulez ... Comment pourriez-vous éventuellement à ce sujet? Vous ne savez rien sur A - vous ne savez pas ce que son toString renvoie, vous ne savez pas quelles méthodes il implémente, etc

Donc, fondamentalement, changer votre algorithme.

0

Vous obtenez une erreur de compilation parce que vous essayez d'utiliser un Comparable où le compilateur attend un A, ce que vous vraiment voulez faire est:

val min: A = new A { 
    def compareTo(other: A) = -1 
    } 

mais vous ne pouvez pas faire ceci dans Scala (ou Java), parce que vous essayez de créer un objet d'un type inconnu (A). Vous pouvez le faire en utilisant la réflexion, mais vous auriez toujours le problème de créer un objet qui était inférieur à tout autre objet dans la liste. De plus, sachez que votre implémentation de compareTo aura des problèmes avec presque tous les algorithmes de tri que vous choisissez, parce que vous ne pouvez pas garantir que compareTo est toujours appelé depuis min. Par exemple, vous pourriez obtenir:

min.compareTo(list(0)) // returns -1 
list(0).compareTo(min) // could be anything really 

Si vous voulez une liste qui retourne un objet spécifique comme « minimum » alors vous pourriez juste préfixer une valeur spécifique à la liste triée:

class MyList2[A <: Comparable[A]] { 
    val min: A; // somehow create an instance of the class A 
    val list: List[A] 

    def sort(fn: (A, A) => Boolean) = { 
     min :: list.sort(fn) 
    } 
} 

mais Comme le dit Daniel, c'est probablement la mauvaise façon de s'y prendre.

Questions connexes