gpt4 book ai didi

scala - Scala 中奇怪的类型不匹配

转载 作者:行者123 更新时间:2023-12-01 02:54:10 24 4
gpt4 key购买 nike

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

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

我还没有编写任何使用这个框架的代码,但是在交互式 session 中尝试它发现了一个我不太理解的类型错误:
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 的经验,我想这个解决方案只是一个小小的改变。;)
有人可以帮助我吗?谢谢。

P.S.:使用 Scala 2.8.0.final

最佳答案

在我看来,定义了两个不同的语言类。在 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可能有用,尽管这是很多信息,所以如果可能的话,我宁愿避免它。

关于scala - Scala 中奇怪的类型不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3617351/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com