写出一个Scala类,这里的问题是编译器认为代码是一个没有返回正确值的单元。这是一种用于在类中设置属性的方法:
def setObject(`object`:StripeObject):StripeObject = {
this.`object` = `object`
}
错误是:type mismatch; found : Unit required: com.stripe.StripeObject
完整的课程是:
case class EventData(var previousAttributes: HashMap[String,Object], var `object`:StripeObject) extends StripeObject {
def getPreviousAttributes = {
previousAttributes
}
def setPreviousAttributes(previousAttributes: HashMap[String, Object]) = {
this.previousAttributes = previousAttributes
}
def getObject = {
`object`
}
def setObject(`object`:StripeObject):StripeObject = {
this.`object` = `object`
}
}
如何确保它不会返回单位?
答案 0 :(得分:5)
在Java中,setter通常使用void
返回类型定义:
public void setObj(StripeObject name);
Scala等效项为Unit
,它也是赋值表达式的值。所以在Scala你会写一个setter作为以下之一(它们都是等价的,第一个是最惯用的):
def setObj(obj: StripeObject) {
this.obj = obj
}
def setObj(obj: StripeObject): Unit = {
this.obj = obj
}
def setObj(obj: StripeObject) = this.obj = obj
这只是setter的惯例,如果你愿意,你可以轻松返回值:
def setObj(obj: StripeObject): StripeObject = {
this.obj = obj
obj
}
这有点不寻常,但即使对于期望Unit
的来电者也不会引起问题。
答案 1 :(得分:2)
我花了一些时间来解决这个问题,但是在Scala中,分配不会像在Java中那样返回值。不知道为什么他们这样做,但他们做到了。这是一些示例代码,因此您可以在Scala控制台中看到它:
scala> var number = 30
number: Int = 30
scala> var otherNumber = number = 40
otherNumber: Unit = ()
因此,您需要在方法中返回 object
。另外,避免在代码中使用像这样的语言关键字,即使这是可能的,也会使代码难以阅读。
答案 2 :(得分:2)
在每个你看到
的情况下whatever = something
替换为
whatever = something ; whatever
你会没事的。分配 返回Unit
。所以只需重述你想要的东西。