2010-09-01 80 views
4

我希望这个问题还没有在其他地方回答。在这里没有找到答案。奇怪类型在Scala中不匹配

在我定位系统我有一个名为语言

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

我真的没有线索有什么问题。但从我与Haskell的经验来看,我认为解决方案只是一个小小的改变;)
有人能帮助我吗?谢谢。

P.S:使用Scala的2.8.0.final

+0

'LanguageCreator'类可能很有趣?也许你可以尝试把它煮成尽可能少的代码,但仍然给出相同的错误 – svrist 2010-09-01 11:28:43

+0

您好svrist和thx您的回复 在交互式会话中,我将代码简化为基本上您看到的getter/setter内容LanguageCentral,它工作得很好。所以感谢您的提示:至少我知道错误不存在;) LanguageCreator使用opencsv周围的自制包装创建需求语言。我有点不愿意发布全班(100行)。任何怀疑?我应该寻找什么?一些懒惰的魔术可能? (没有明确地使用懒惰) 顺便说一下:本地化框架还没有包(所以我可以测试它)。 编译器只创建一个Language.class – Agl 2010-09-01 13:13:18

+0

没有换行符? (wasntme) – Agl 2010-09-01 13:14:08

回答

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可能是有用的,虽然这是很多的信息,所以我宁愿避免它,如果可能的话。

+0

只是要清楚:我认为REPL是解释者? 语言,LanguageCreator和LanguageCentral都驻留在相同的.scala文件中。由于目前没有包装声明,并且除了标准包和opencsv的包装(这是我检查过的,没有声明类语言)之外的任何东西。我必须现在运行,但在2小时内,我会为该REPL选项执行项目范围检查和/或谷歌。感谢您的回答。非常感激。 – Agl 2010-09-01 13:58:54

+0

哦,只是要说清楚一点:目前没有任何书面的代码尝试做我在解释器中做了什么。我仍然需要这样做,但很可能我会在编译时遇到同样的错误。 – Agl 2010-09-01 14:00:43

+0

@Agl是的,REPL是“口译员”。它代表了read-eval-print循环,它比“解释器”更准确,因为Scala不解释代码,只是编译它。我建议这可能是REPL内部发生的一个问题,因为你已经显示了从REPL中显示的错误。 – 2010-09-01 15:23:04