2010-09-01 96 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