2016-12-05 134 views
0

当前我有一个名为example的抽象类,三个扩展抽象类的case类和一个返回类型为example的函数。在函数中,当满足某个条件时,它应该返回一个示例类型,但由于某种原因它说:类型不匹配,找到:单元,要求:示例Scala在if/else语句中返回对象类型

我不明白为什么,因为我在主函数在每个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

注意:在Scala中不使用'return',通常[完全不使用](https://tpolecat.github.io/2014/05/09/return.html)。 Scala中的'return'与Java中的不一样! –

回答

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() 

另外,还要注意的是,在你的原代码,2型和3型对象不会因为条件或者总是真的,还是假的总是实例化。

最后,你的函数有副作用,因为它的行为依赖于条件,这不是它的一个参数。你不应该那样做。

作为一个结论,你的源代码应该大概是这样的:

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() 
+0

可否请您详细说明所有要点? –

+0

我更新了我的答案,试图按要求详细说明。 – mgoeminne

+0

如果case类完全没有值,它们应该是case对象。 – Jesper

0

你忘了在最后的“否则,如果”实施else块。

Scala方法返回它们的主体中的最后一个表达式的值,而条件布尔表达式没有else块有一个Unit类型。因此错误。