Scala构造函数和枚举的问题

时间:2011-10-02 16:33:11

标签: scala enums constructor

我在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(Eclipse的Scala IDE)告诉我它找不到getErrorTypeValue。它还告诉我重载的构造函数有替代品。一个是字节,另一个是枚举。

尽管不要认真对待IDE的这些错误消息。它们可能是错误的,因为IDE经常会发生这种情况。但是,当IDE告诉我出错时,通常是错误的。

那么,我的类/构造函数定义有什么问题?

3 个答案:

答案 0 :(得分:4)

在这种情况下,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) {
}

查看How can I call a method in auxiliary constructor?

的答案

答案 1 :(得分:2)

0x00等是恰好是十六进制的Int个文字。

getErrorTypeValue会返回Int,因此this(getErrorTypeValue(errorType))会引用一个Int的构造函数,该构造函数不存在。

如果要将数字文字键入Byte,请使用0x01: Byte,或指定方法private def getErrorTypeValue(errorType: ErrorType): Byte = {的返回类型以使用隐式转换。

答案 2 :(得分:0)

问题是委托构造函数时无法调用getErrorTypeValue因为尚未创建对象。

我想。