Scala 构造函数和枚举的问题

发布于 2024-12-08 03:27:54 字数 760 浏览 0 评论 0原文

我在 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 告诉我有什么问题时,它通常是错误的。

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

I have the following class definition in 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 is the following enum:

object ErrorType extends Enumeration {

  type ErrorType = Value
  val USER_OFFLINE, PM_TO_SELF = Value
}

I think something is wrong with the constructor definitions in the class. My IDE (which is the Scala IDE for Eclipse) tells me it cannot find getErrorTypeValue. It also tells me that the overloaded constructor is has alternatives. One being the byte and the other the enum.

Don't take these error messages of the IDE seriously though. They might be wrong, as this often happens with the IDE. But nonetheless, when the IDE tells me something is wrong, it usually is wrong.

So, what is the problem with my class/constructor definitions?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

追风人 2024-12-15 03:27:54

在这种情况下,IDE 是完全正确的,并且与 scala 命令行编译器一致。

您的构造函数需要一个 Byte,因此您需要为其提供一个(0x00 是 Int),您需要导入 ErrorType._ 并且需要将 getErrorTypeValue 移至伴生对象并声明它返回一个 Byte(推断类型为an 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) {
}

请参阅 如何在辅助构造函数中调用方法?

In this case the IDE is perfectly correct and agrees with the scala command line compiler.

Your constructor takes a Byte, so you need to provide it with one (0x00 is an Int), you need to import ErrorType._ and you need to move getErrorTypeValue to the companion object and declare it to return a Byte (the inferred type is an 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))
}

Another, better way is to avoid having multiple constructors and use a factory method:

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) {
}

See the answers to How can I call a method in auxiliary constructor?

遇到 2024-12-15 03:27:54

0x00 等是碰巧采用十六进制的 Int 文字。

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

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

0x00 etc are Int literals that happen to be in hexadecimal.

getErrorTypeValue returns an Int so this(getErrorTypeValue(errorType)) refers to a constructor taking an Int, which doesn't exist.

If you want to type your number literals as Byte, use 0x01: Byte, or specify the return type of your method private def getErrorTypeValue(errorType: ErrorType): Byte = { to use an implicit cast.

抽个烟儿 2024-12-15 03:27:54

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

我认为。

The problem is you can't call getErrorTypeValue when delegating the constructor 'cause the object isn't created yet.

I think.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文