Scala中奇怪的类型不匹配

时间:2010-09-01 11:07:49

标签: scala

我希望这个问题在其他地方尚未得到解答。在这里找不到答案。

在我的本地化系统中,我有一个名为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
}

和一个名为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
}

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

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)
                                      ^

我真的不知道什么是错的。但根据我对Haskell的经验,我猜这个解决方案只是一个小小的改变。;)
有人能帮帮我吗? THX。

P.S。:使用Scala 2.8.0.final

1 个答案:

答案 0 :(得分:3)

对我而言,似乎定义了两个不同的语言类。在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打印出完全合格的类型,但我目前找不到咒语。

修改

从编译器方面,您可以使用-uniqid-explaintypes来获取更好的错误消息。事实上,我总是使用后者。如果您无法理解它们,请与他们一起更新您的问题,我会看一下。此外,-Xprint-types可能有用,虽然这是很多信息,所以如果可能的话我宁愿避免使用它。