1
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); }
                                                                                                                                 ^
4

3 回答 3

9

我可以告诉你哪里出错了,但你想在这里做什么并不完全清楚。

您已将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对于阅读您的代码的人来说是令人惊讶的混乱,因此您将通过遵守约定为您自己和其他所有人提供帮助。

于 2012-05-25T11:29:47.153 回答
2

错误消息告诉您 println 的返回类型为 Unit,因此由于您的 getLlength 方法返回 println 的结果,因此它将返回 Unit。这是一个错误,因为您说 getLlength 的返回类型应该是 Int。

如果您希望您的 getLlength 方法打印长度,您可能应该将其返回类型更改为 Unit(并将名称更改为明确的名称)。

如果您希望 getLlength 方法返回长度,则不应调用 println,而应仅返回长度。

于 2012-05-25T11:28:14.527 回答
2

如果您想打印出 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 参数长度或宽度。

于 2017-09-14T12:57:40.003 回答