假設以下場景
sealed trait Status
case object Active extends Status
case object Inactive extends Status
@scala.deprecated("deprecated because reasons")
case object Disabled extends Status /
考慮到Disabled無法洗掉物件,并且val status: Status = getStatus存在以下問題之一:
- 失敗,匹配不詳盡:
status match {
case Active => ???
case Inactive => ???
}
- 因使用不推薦使用的值而失敗
status match {
case Active => ???
case Inactive => ???
case Disabled => ???
}
- 失去編譯時安全性
status match {
case Active => ???
case Inactive => ???
case _ => ???
}
在這種情況下可以實作型別安全詳盡匹配嗎?
uj5u.com熱心網友回復:
我認為選項 2 是可行的方法。但是要使其作業,您必須有選擇地禁用警告。從Scala 2.13.2 和 2.12.13開始支持
@annotation.nowarn("cat=deprecation")
def someMethod(s: Status) = s match {
case Active => "Active"
case Inactive => "Inactive"
case Disabled => "Disabled"
}
uj5u.com熱心網友回復:
“已棄用”和“不可用”之間可能存在一些混淆。
該Disabled值deprecated,但它仍然可以使用。并且因為它仍然可用,所以它仍然必須在代碼中得到支持,因為它仍然可以使用。因此,選項 2 是唯一可接受的解決方案,因為它是唯一可以Disabled在型別安全的情況下進行適當處理的解決方案。選項 1 不處理Disabled,選項 3 失去型別安全性。
還要注意,這些代碼示例都沒有“失敗”,它們只是生成警告。因此,解決方案是抑制其他答案中所述的棄用警告。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/403449.html
標籤:
