目前我有一个名为example的抽象类,三个扩展抽象类的case类,以及一个返回类型为example的函数。在函数中,当满足某个条件时,它应该返回一个示例类型但由于某种原因它说:类型不匹配,找到:单位,必需:示例
我不明白为什么,因为我在每个if语句的末尾返回示例类型...
abstract class example
case class type1() extends example
case class type2() extends example
case class type3() extends example
def func(): example = {
if (condition)
return (val x= type1())
else if (condition)
return (val x= type2())
else if (condition)
return (val x= type3())
}
在主函数中,我调用func()
答案 0 :(得分:3)
返回后括号的类型不是示例。
return (val x= type1())
甚至没有意义:你说x取一个特定的价值......然后回归这个事实。所以,如果你删除" val x =" (无论如何都是无用的),你得到:
return type1()
表示"通过创建type1"类型的新对象返回我刚刚指定的值。
另外,您应该尊重Scala命名约定。特别是,classe名称必须是驼峰式的:
abstract class Example
case class Type1() extends Example
case class Type2() extends Example
case class Type3() extends Example
另外,您多次评估相同的条件,并且没有充分的理由这样做。因此,您应该简化函数的定义方式。此外,您不应使用显式返回。类似的东西:
def func(): example = if (condition) Type1()
else Type2()
另请注意,在原始代码中,type2和type3对象永远不会实例化,因为 condition 始终为true,或者始终为false。
最后,您的函数有副作用,因为它的行为依赖于 condition ,它不是它的参数之一。你不应该这样做。
总之,您的源代码应该如下所示:
abstract class Example
case class Type1() extends Example
case class Type2() extends Example
case class Type3() extends Example
def func(condition: Boolean): Example = if(condition) Type1()
else Type2()
答案 1 :(得分:0)
你忘了在最后一次之后实施其他阻止"否则如果"。
Scala方法返回其主体中的最后一个表达式的值,而条件brach没有else块的类型为Unit。因此错误。