2014-10-17 43 views
0

在我的測試我的代碼看起來像這樣:模式匹配,其中失敗的情況下返回類型是Java無

val myVar = getVar() match { 
    case Some(v) => v 
    case None => fail() // TestNG 
} 
// more testing on myVar 
... 

// TestNG 
public static void fail() { ... } 

的問題是,myVar被分配的Any類型。處理這種情況的最佳方式是什麼?

+0

'失敗'是否會拋出異常?如果不是在失敗返回後應該賦予'myVar'什麼值? – bmaderbacher 2014-10-17 16:38:08

+0

@bmaderbacher我的印象是'失敗'拋出一個異常,但現在我不確定。我會檢查。 – 2014-10-17 16:40:40

+0

@bmaderbacher是的,'失敗'總是拋出一個異常。 – 2014-10-17 16:43:25

回答

6

首先一點設置的使用適配器時,匹配您的環境(ISH)

scala> def fail(): Unit = throw new RuntimeException("blah") 
fail:()Unit 

scala> def getVar(): Option[String] = Some("hello") 
getVar:()Option[String] 

現在寫不返回任何內容,而不是單位

scala> def myFail(): Nothing = {fail(); ???} 
myFail: Nothing 

適配器和代碼按預期工作

scala> val myVar = getVar() match { 
| case Some(v) => v 
| case None => myFail() 
| } 
myVar: String = hello 

順便說一下,這可以寫得更乾淨如

scala> val myVar = getVar() getOrElse myFail() 
myVar: String = hello 

更多的單位類型及其關係無效http://james-iry.blogspot.com/2009/07/void-vs-unit.html 更多關於沒什麼類型http://james-iry.blogspot.com/2009/08/getting-to-bottom-of-nothing-at-all.html

+0

斯卡拉是否將Java'void'方法的返回值視爲'Unit'呢? – 2014-10-17 16:44:50

+0

如果這確實如何與'void' Java方法一起工作,那麼我的代碼中的問題必須來自其他地方。 – 2014-10-17 16:45:40

+0

+1這是我想到的相同解決方案。 – bmaderbacher 2014-10-17 16:47:27

1

我只添加一個可能的答案。這使用@JamesIry描述的方法,但使用了內聯部分函數。它具有相同的效果,但稍微短一些。

val myVar = getVar() match { 
    case Some(v) => v 
    case None => { fail(); ??? } : Nothing 
}