English 中文(简体)
找到单位: 单位要求: Int - 如何纠正?
原标题:found: Unit required: Int - How to correct this?
  • 时间:2012-05-25 11:23:58
  •  标签:
  • scala
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); }
                                                                                                                                 ^
最佳回答

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

您已经宣布了 gigL长 (sic) 方法返回一种类型的 Int 。 但是, 此方法的正文只是一个 < code> println 调用, 因此它会返回此呼叫的结果 。 pripln 有一种返回类型 < code> United (因为它没有返回任何内容, 并且只因其副作用而执行 )。

因此,您的方法是 < em> 声明 返回 < code> Int , 但是您已经实施了它, 它的返回类型将是 < code > United 。 这就是为什么您会发现一个编译时间错误 。

您想要返回长度的方法吗? 如果是的话, 您应该只返回 < code> Length 而不是打印它。 然而, 更好的方法就是 Scala 将构建参数标记为 < code> val , 这将自动生成一个访问器 :

class Rectangle(val Length: Int, ...

现在,任何人,如提到 Rectangle 矩形 对象,都可以调用 rect.Length 来获取长度。事实上,这是访问Scala 中字段和类似字段属性的首选方法,而不是 Java 使用的 get Foo Convention。


如果您真的想要一个“ 容器” 类, 允许某人访问指定参数, 请考虑 < a href=" "http://www.scala- lang.org/ node/107" > case类 。 您可以将功能等同的类定义为

case class Rectangle(length: Int, width: Int)

这将自动生成两个字段的存取器方法, 明智的 to String () , equals () > 和 hashCode () 执行, 并且您还可以将模式匹配作为附加的奖金 。

任何时候,只要你想要一个基本上/完全只是一堆字段的班级, 办案班应该是你的起点。


请注意, Scala 中的变量按常规是低的 CamelCase 。 使用上等名称( 即 < code > Length 而不是 < code > 长 < / code > ) 来声明字段/ 构件参数对阅读您的代码的人来说令人惊讶地感到困惑, 所以您会遵守公约, 从而给您自己和所有人一个好处 。

问题回答

错误消息告诉您, Println 拥有返回类型单位, 所以由于您的 L get Lent 方法返回 Println 的结果, 它会返回 United 。 这是一个错误, 因为您说 L get Lon 应该有一个 Int 的返回类型 。

如果您想要您的 LEL 长度打印法打印长度, 您也许应该将其返回类型更改为 United( 并更改名称为能清楚显示此内容的单位 ) 。

如果您想要您的 LL 长度法返回长度, 您不应该拨打 Prestln, 而是只返回长度 。

如果您想要打印长度和宽度的值, 并且将返回方法的类型保留为 Int, 您可以使用类似这样的结构 。

class Rectangle (Length: Int, Width: Int) {
 def getLlength (): Int ={ println (Length); Length}
 def getWidth ():Int = {println (Width); Width}
 }

在 scala () 中发生的情况是, 编译者将方法的最后一行总是作为返回语句处理, 因此当您在方法体中写一个 pripln () 时, Scala 编译者假定也是您的返回语句, 在 Scala 返回 println () 类型是 United, 这就是为什么您要得到这个错误。 所以, 如果您想要 Int 作为您的返回类型, 您只需要添加一行作为您方法的最后一行, 也就是您的 Int参数长度或 Width 。





相关问题
How to flatten a List of different types in Scala?

I have 4 elements:List[List[Object]] (Objects are different in each element) that I want to zip so that I can have a List[List[obj1],List[obj2],List[obj3],List[obj4]] I tried to zip them and I ...

To use or not to use Scala for new Java projects? [closed]

I m impressed with Twitter and investigating to use Scala for a new large scale web project with Hibernate and Wicket. What do you think about Scala, and should I use it instead of Java? EDIT: And, ...

Why does Scala create a ~/tmp directory when I run a script?

When I execute a Scala script from the command line, a directory named "tmp" is created in my home directory. It is always empty, so I simply deleted it without any apparent problem. Of course, when I ...

Include jar file in Scala interpreter

Is it possible to include a jar file run running the Scala interpreter? My code is working when I compile from scalac: scalac script.scala -classpath *.jar But I would like to be able to include a ...

Scala and tail recursion

There are various answers on Stack Overflow which explain the conditions under which tail recursion is possible in Scala. I understand the limitations and how and where I can take advantage of tail ...

热门标签