當然我知道所有類型做有一個共同的祖先,但我的意思是這樣的:函數是否可以返回不共享祖先的多種類型之一?
在動態類型語言,它是一種常見的做法有「混合」的返回類型。一個常見的情況是嘗試從數據庫檢索數據,然後返回一個對象(使用找到的數據進行初始化)或FALSE(在沒有找到數據的情況下)的函數。
有點僞證明了這樣一個反模式:
function getObjectFromDatabase(object_id) {
if(result = db_fetch_object("SELECT * FROM objects WHERE id = %d", object_id) {
return result
} else {
return FALSE
}
}
如果找到我的對象ID數據,我得到一個數據庫記錄追溯到一個對象。如果沒有,我得到一個布爾值。然後,當然,這是我的客戶,處理多種可能的返回類型。
在Scala中找到所有可能的返回類型的共同祖先並將其聲明爲簽名中的返回類型是唯一的方法嗎?
// Like so:
def getObjectFromDatabase(objectId: Int): Any = {
val result = dbFetchObject("SELECT * FROM objects WHERE id = %d", object_id)
if(result) {
return result
} else {
return false
}
}
或者是有可能註釋多個可能的返回類型? (請注意,我不想希望有可能做到這一點,因爲我希望它被強制執行,函數返回類型儘可能明確。這將使我瞭解到。語言禁止模棱兩可的返回類型,這是比較我要求的原因)
只有當預期的返回類型在邏輯上只能是這兩種類型中的一種時,「任一」纔是有效的選擇。從概念上講,這不是一個好的邏輯解決方案,你以後可以添加另一種類型。即不存在'Either [Int,String,Double]'這樣的事情 – Adrian