Scala 构造函数和枚举的问题
我在 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
在这种情况下,IDE 是完全正确的,并且与 scala 命令行编译器一致。
您的构造函数需要一个 Byte,因此您需要为其提供一个(0x00 是 Int),您需要导入 ErrorType._ 并且需要将 getErrorTypeValue 移至伴生对象并声明它返回一个 Byte(推断类型为an Int):
另一种更好的方法是避免使用多个构造函数并使用工厂方法:
请参阅 如何在辅助构造函数中调用方法?
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):
Another, better way is to avoid having multiple constructors and use a factory method:
See the answers to How can I call a method in auxiliary constructor?
0x00
等是碰巧采用十六进制的Int
文字。getErrorTypeValue
返回一个Int
,因此this(getErrorTypeValue(errorType))
引用一个采用Int
的构造函数,它不不存在。如果您想将数字文字输入为
Byte
,请使用0x01: Byte
,或指定方法的返回类型private def getErrorTypeValue(errorType: ErrorType): Byte = {
使用隐式强制转换。0x00
etc areInt
literals that happen to be in hexadecimal.getErrorTypeValue
returns anInt
sothis(getErrorTypeValue(errorType))
refers to a constructor taking anInt
, which doesn't exist.If you want to type your number literals as
Byte
, use0x01: Byte
, or specify the return type of your methodprivate def getErrorTypeValue(errorType: ErrorType): Byte = {
to use an implicit cast.问题是在委托构造函数时无法调用 getErrorTypeValue,因为对象尚未创建。
我认为。
The problem is you can't call
getErrorTypeValue
when delegating the constructor 'cause the object isn't created yet.I think.