Проблемы с конструкторами и перечислениями Scala - PullRequest
3 голосов
/ 02 октября 2011

У меня есть следующее определение класса в Scala:

class AppendErrorMessageCommand private(var m_type: Byte) {

  def this() = this(0x00)

  def this(errorType: ErrorType) = this(getErrorTypeValue(errorType))

  private def getErrorTypeValue(errorType: ErrorType) = {
    if(errorType == USER_OFFLINE)
      0x01
    else if(errorType == PM_TO_SELF)
      0x02

    0x00  
  }
}

ErrorType - это следующее перечисление:

object ErrorType extends Enumeration {

  type ErrorType = Value
  val USER_OFFLINE, PM_TO_SELF = Value
}

Я думаю, что-то не так с определениями конструктора в классе.Моя IDE (Scala IDE для Eclipse) сообщает, что не может найти getErrorTypeValue.Это также говорит мне, что перегруженный конструктор имеет альтернативы.Один является байтом, а другой - перечислением.

Не воспринимайте эти сообщения об ошибках IDE серьезно.Они могут ошибаться, как это часто случается с IDE.Но, тем не менее, когда IDE сообщает мне, что что-то не так, обычно это неправильно.

Итак, в чем проблема с моими определениями класса / конструктора?

Ответы [ 3 ]

5 голосов
/ 03 октября 2011

В этом случае IDE совершенно верна и согласуется с компилятором командной строки scala.

Ваш конструктор берет байт, поэтому вам нужно предоставить его один (0x00 - это Int), вам нужноимпортируйте ErrorType._, и вам нужно переместить getErrorTypeValue в объект-компаньон и объявить его, чтобы он возвращал байт (выводимый тип - Int):

object ErrorType extends Enumeration {
  type ErrorType = Value
  val USER_OFFLINE, PM_TO_SELF = Value
}

import ErrorType._

object AppendErrorMessageCommand {
  private def getErrorTypeValue(errorType: ErrorType): Byte = {
    if(errorType == USER_OFFLINE)
      0x01
    else if(errorType == PM_TO_SELF)
      0x02

    0x00  
  }
}

class AppendErrorMessageCommand private(var m_type: Byte) {
  def this() = this(0x00.toByte)
  def this(errorType: ErrorType) = this(AppendErrorMessageCommand.getErrorTypeValue(errorType))
}

Другой, лучший способ - избежать использования нескольких конструкторов ииспользуйте фабричный метод:

object AppendErrorMessageCommand {
  def apply() = new AppendErrorMessageCommand(0x00)
  def apply(b: Byte) = new AppendErrorMessageCommand(b)
  def apply(errorType: ErrorType) = new AppendErrorMessageCommand(AppendErrorMessageCommand.getErrorTypeValue(errorType))

  private def getErrorTypeValue(errorType: ErrorType): Byte = {
    if(errorType == USER_OFFLINE)
      0x01
    else if(errorType == PM_TO_SELF)
      0x02

    0x00  
  }
}

class AppendErrorMessageCommand private(var m_type: Byte) {
}

См. ответы на Как вызвать метод во вспомогательном конструкторе?

2 голосов
/ 02 октября 2011

0x00 и т. Д. - это Int литералы в шестнадцатеричном формате.

getErrorTypeValue возвращает Int, поэтому this(getErrorTypeValue(errorType)) относится к конструктору, принимающему Int, который не 't существует.

Если вы хотите ввести числовые литералы как Byte, используйте 0x01: Byte или укажите тип возврата вашего метода private def getErrorTypeValue(errorType: ErrorType): Byte = {, чтобы использовать неявное приведение.

0 голосов
/ 02 октября 2011

Проблема в том, что вы не можете вызвать getErrorTypeValue при делегировании конструктора, потому что объект еще не создан.

Я думаю.

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