类型不匹配错误(Scala)

时间:2015-12-02 17:31:04

标签: java scala

case class Item(val brand: String, val count: Int)

class Inventory {
  def add(amount:Int, item: Item): Item = {
    if(amount>0)    
    item.copy(count = item.count+amount)     
  }

  def subtract(amount:Int, item: Item): Item = {
    if(amount>0)
    item.copy(count = item.count-amount)
  }
}

如何将else if语句添加到此代码中,以使该数量必须大于0?当我添加if语句时,我收到类型不匹配错误。

2 个答案:

答案 0 :(得分:2)

问题是你的函数并不总是返回,函数总是要返回单个值。当amount不大于零时会发生什么?我想你需要按原样返回item。我们通过添加else语句来修复它。

def add(amount:Int, item: Item): Item = {
if(amount>0)    
  item.copy(count = item.count+amount)
else
  item     
}

答案 1 :(得分:2)

if是scala中的表达式,因此它会计算为某些内容。如果你不放,那么编译器会为()提供类型为Unit的{​​{1}}。这将使您的表达式返回UnitItem。他们的常见超类型为Any,因此此表达式的类型实际为Any,而预期类型为Item

def add(amount: Int, item: Item): Item = {
  if(amount > 0)    
    item.copy(count = item.count + amount)     
}

如果您想要要求金额大于零,只需检查它并抛出异常(如果不是)。您可以使用内置require

def add(amount: Int, item: Item): Item = {
  require(amount > 0)    
  item.copy(count = item.count + amount)     
}

或者你可以默默地处理这个问题,如果传递了错误的参数,就不要修改项目

def add(amount: Int, item: Item): Item = {
  if(amount > 0)    
    item.copy(count = item.count + amount)
  else
    item
}

顺便说一下,你不需要在案例类中使用val,无论如何它都是val。这应该是这样的:

case class Item(brand: String, count: Int)