Странное несоответствие типов в Scala - PullRequest
4 голосов
/ 01 сентября 2010

Я надеюсь, что на этот вопрос еще не ответили где-то еще. Не нашел ответа здесь.

В моей системе локализации у меня есть класс с именем 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 Ответ

3 голосов
/ 01 сентября 2010

Мне кажется, что определены два разных языковых класса. Один из способов сделать это в 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 печатать полностью определенные типы, но я не смог найти заклинание в данный момент.

EDIT

Со стороны компилятора вы можете использовать -uniqid и -explaintypes для получения более качественных сообщений об ошибках. Я всегда использую последнее, на самом деле. Если вы не можете их понять, обновите свой вопрос, и я посмотрю на него. Кроме того, -Xprint-types может быть полезен, хотя это очень много информации, поэтому я бы предпочел избежать этого, если это возможно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...