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); }
^
Run Code Online (Sandbox Code Playgroud)
我可以告诉你哪里出错了,但你想在这里做什么并不完全明显.
你已经声明getLlength(sic)方法返回一种类型Int.但是,此方法的主体只是一个println调用,因此它将返回此调用的结果. println具有返回类型Unit(因为它不返回任何内容,并且仅针对其副作用执行).
因此,您的方法被声明为返回Int,但您已经以它的返回类型的方式实现它Unit.这就是你得到编译时错误的原因.
你想让你的方法返回长度吗?如果是这样,你应该返回Length而不是打印它.但是,更好的方法是Scala将构造函数参数标记为a val,它将自动生成一个访问器:
class Rectangle(val Length: Int, ...
Run Code Online (Sandbox Code Playgroud)
现在任何引用例如Rectangle rect对象的人都可以调用rect.Length来获取长度.实际上,这是访问Scala中字段和类字段属性的首选方法,而不是Java使用的get Foo约定.
如果您真的只想要一个允许某人访问命名参数的"容器"类,请考虑使用案例类.您可以将功能等效的类定义为
case class Rectangle(length: Int, width: Int)
Run Code Online (Sandbox Code Playgroud)
这会自动生成两个字段,明智的访问方法toString(),equals()以及hashCode()实现-而你也可以得到模式匹配作为一个额外的好处.
任何时候你想要一个主要/完全只是一组字段的类,案例类应该是你的起点.
还要注意,Scala中的变量按照惯例是lowerCamelCase.使用大写名称(即Length代替length)来声明字段/构造函数参数对于阅读代码的人来说是令人惊讶的混淆,因此您将通过坚持惯例来做自己和其他人的帮助.
| 归档时间: |
|
| 查看次数: |
8242 次 |
| 最近记录: |