代码之家  ›  专栏  ›  技术社区  ›  Agl

Scala中奇怪的类型不匹配

  •  4
  • Agl  · 技术社区  · 16 年前

    我希望这个问题还没有在别的地方得到回答。在这里找不到答案。

    在我的本地化系统中,我有一个名为Language的类

    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
    }
    

    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
    }
    

    我还没有编写任何使用此框架的代码,但是在交互式会话中尝试它会发现一个类型错误,我不太明白:

    scala> val l = new LanguageCreator("Languages.csv").getLanguage("English")
    l: Option[Language] = Some(Language@7aeb46d)
    
    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)
                                          ^
    


    有人能帮我吗?谢谢。

    备注:使用Scala 2.8.0.final

    1 回复  |  直到 16 年前
        1
  •  3
  •   Daniel C. Sobral    16 年前

    在我看来,似乎有两个不同的语言类定义。在REPL上发生这种情况的一种方式是:

    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
    

    在REPL之外,它们可能只是在不同的包中。有一种方法可以让REPL print完全限定类型,但我现在找不到咒语。

    在编译器方面,您可以使用 -uniqid -explaintypes 以获得更好的错误消息。事实上,我总是用后者。如果你不能理解他们,请用他们更新你的问题,我来看看。也, -Xprint-types

    推荐文章