2010-09-01 7 views
4

J'espère que cette question n'a pas encore été répondue ailleurs. Je n'ai pas trouvé de réponse ici.Bizarre Type Mismatch dans Scala

Dans mon système de localisation que j'ai une classe nommée Langue

class Language(val name:String, dict:HashMap[String, String]) { 
    def apply(key: String):String = (dict get key) match { 
    case None => "°unknown°" 
    case Some(s) => s 
    } 

    //DO SOME OTHER THINGS 
} 

et un objet nommé LanguageCentral

object LanguageCentral { 
    private var lang:Option[Language] = None 
    //SOME OTHER PRIVATE MEMBERS 

    def language = lang 

    def language_=(l:Option[Language]) = l match { 
    case None => {} 
    case Some(l) => setLanguage(l) 
    } 

    def setLanguage(l:Language) { 
    lang = Some(l) 
    //DO SOME OTHER THINGS 
    } 

    //DO LOTS OF OTHER THINGS 
} 

Je n'ai pas écrit un code qui est en utilisant encore ce cadre, mais essayer dans une session interactive a révélé une erreur de type que je ne comprends pas vraiment:

scala> val l = new LanguageCreator("Languages.csv").getLanguage("English") 
l: Option[Language] = Some([email protected]) 

scala> LanguageCentral.language=l           
<console>:23: error: type mismatch; 
found : Option[Language] 
required: Option[Language] 
     LanguageCentral.language=l 
           ^

scala> LanguageCentral setLanguage (l getOrElse null)      
<console>:24: error: type mismatch; 
found : Language 
required: Language 
     LanguageCentral setLanguage (l getOrElse null) 
            ^

Je n'ai vraiment aucune idée de ce qui ne va pas. Mais d'après mon expérience avec Haskell, je suppose que la solution n'est qu'un changement mineur.)
Quelqu'un pourrait m'aider? THX.

P.S .: Scala utilisant 2.8.0.final

+0

La classe 'LanguageCreator' pourrait être intéressante? Peut-être que vous pourriez essayer de le réduire à un code aussi faible que possible qui donne toujours la même erreur – svrist

+0

salut svrist et thx pour votre réponse Dans une session interactive j'ai réduit le code à essentiellement les choses getter-/setter que vous voyez dans LanguageCentral et cela a bien fonctionné. Donc merci pour votre conseil: au moins je sais que l'erreur n'est pas là;) LanguageCreator crée la langue demandée en utilisant un wrapper selfmade autour d'opencsv. Je suis un peu réticent à poster toute la classe (100 lignes). Des soupçons? Que devrais-je rechercher? Une magie paresseuse peut-être? Par ailleurs: le framework de localisation n'a pas encore de paquet (donc je peux le tester). Le compilateur crée un seul Language.class – Agl

+0

aucun saut de ligne? (wasntme) – Agl

Répondre

3

Pour moi, il semble qu'il y ait deux classes de langues distinctes définies. Une façon que cela se produise sur REPL est comme ceci:

class Language 
class LanguageCreator // using Language 
// Oops, there's something that needs fixing on Language 
class Language 
object LanguageCentral // refers to a different Language altogether 

En dehors REPL, ils pourraient juste être dans des emballages différents. Il existe un moyen de faire en sorte que REPL imprime des types entièrement qualifiés, mais je n'ai pas trouvé l'incantation pour le moment.

EDIT

Du côté du compilateur, vous pouvez utiliser -uniqid et -explaintypes pour obtenir de meilleurs messages d'erreur. J'utilise toujours ce dernier, en fait. Si vous ne pouvez pas les comprendre, veuillez mettre à jour votre question avec eux, et je vais y jeter un coup d'œil. En outre, -Xprint-types peut être utile, bien que ce soit beaucoup d'informations, donc je préfère l'éviter si possible.

+0

Juste pour être clair: je suppose que REPL est l'interprète? Language, LanguageCreator et LanguageCentral résident tous dans le même fichier .scala. Avec actuellement aucune déclaration de paquet autour d'eux et ne pas importer n'importe quoi excepté les paquets standard et le Wrapper autour d'opencsv (qui, comme je l'ai vérifié, ne déclare pas une classe Language). Je dois courir maintenant mais dans 2 heures je ferai un chèque de projet large et/ou google pour cette option REPL. Merci pour votre réponse. Très appréciée. – Agl

+0

Oh et juste pour être clair à ce sujet: Actuellement, il n'y a pas de code écrit essayant de faire ce que j'ai fait dans l'INTERPRÈTE.Je dois encore faire cela mais il est très probable que je rencontre la même erreur lors de la compilation. – Agl

+0

@Agl Oui, REPL est l '"interprète". Il est synonyme de boucle read-eval-print, et il est plus précis que "interpreter" car Scala n'interprète pas le code, il le compile juste. J'ai suggéré qu'il pourrait s'agir d'un problème qui s'est produit dans REPL parce que vous avez montré les erreurs affichées à l'intérieur de REPL. –

Questions connexes