类定义认为设置变量是一个单元?

时间:2012-06-07 22:22:38

标签: scala

写出一个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`
  }
}

如何确保它不会返回单位?

3 个答案:

答案 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。所以只需重述你想要的东西。