2016-12-05 52 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類型。因此錯誤。