scala> class Rectangle (Length: Int, Width: Int) {; def getLlength (): Int = println (Length); def getWidth ():Int = println (Width); }
<console>:11: error: type mismatch;
found : Unit
required: Int
class Rectangle (Length: Int, Width: Int) {; def getLlength (): Int = println (Length:Int); def getWidth ():Int = println (Width:Int); }
^
<console>:11: error: type mismatch;
found : Unit
required: Int
class Rectangle (Length: Int, Width: Int) {; def getLlength (): Int = println (Length:Int); def getWidth ():Int = println (Width:Int); }
^
3 回答
我可以告诉你哪里出错了,但你想在这里做什么并不完全清楚。
您已将getLlength
(sic) 方法声明为返回类型为Int
. 但是,这个方法的主体只是一个println
调用,所以它会返回这个调用的结果。 println
有一个返回类型Unit
(因为它什么都不返回,并且只为它的副作用而执行)。
因此,您的方法被声明为 return Int
,但您已经以它的返回类型为Unit
. 这就是您收到编译时错误的原因。
你想让你的方法返回长度吗?如果是这样,您应该只返回Length
而不是打印它。然而,更好的方法是 Scala 将构造函数参数标记为 a val
,这将自动为其生成访问器:
class Rectangle(val Length: Int, ...
现在,任何引用例如Rectangle rect
对象的人都可以调用rect.Length
来获取长度。这实际上是在 Scala 中访问字段和类字段属性的首选方式,而不是 Java 使用的get Foo 约定。
如果您真的只想要一个允许某人访问命名参数的“容器”类,请考虑case classes。您可以将功能等效的类定义为
case class Rectangle(length: Int, width: Int)
toString()
这会自动为 sensible和implementations这两个字段生成访问器方法equals()
-hashCode()
您还可以获得模式匹配作为额外的奖励。
任何时候你想要一个主要/完全只是一组字段的类,案例类应该是你的起点。
另请注意,Scala 中的变量按照惯例是 lowerCamelCase。Length
使用大类名称(即,而不是)声明字段/构造函数参数length
对于阅读您的代码的人来说是令人惊讶的混乱,因此您将通过遵守约定为您自己和其他所有人提供帮助。
错误消息告诉您 println 的返回类型为 Unit,因此由于您的 getLlength 方法返回 println 的结果,因此它将返回 Unit。这是一个错误,因为您说 getLlength 的返回类型应该是 Int。
如果您希望您的 getLlength 方法打印长度,您可能应该将其返回类型更改为 Unit(并将名称更改为明确的名称)。
如果您希望 getLlength 方法返回长度,则不应调用 println,而应仅返回长度。
如果您想打印出 Length 和 width 的值并将方法的返回类型保持为 Int,则可以使用类似这样的结构。
class Rectangle (Length: Int, Width: Int) {
def getLlength (): Int ={ println (Length); Length}
def getWidth ():Int = {println (Width); Width}
}
在 scala 中发生的事情是编译器始终将方法的最后一行视为 return 语句,因此当您只是在方法体中编写 println() 时,Scala 编译器假设它也是您的 return 语句并且在println() 的 Scala 返回类型是 Unit,这就是您收到此错误的原因。因此,如果您希望 Int 作为您的返回类型,您只需要再添加一行作为方法的最后一行,即您的 Int 参数长度或宽度。