def third_list[A](ls: List[A]): A = {
// Code can be changed here
return List(ls(2)) //Error line for return type
}
val l1 = List(1, 2, 3, 4)
println(third_list(l1))
println(third_list(List(1,2,(3,4,5), 6, 7)))
我需要按照回傳型別標準回傳串列的第三個元素。
我收到型別不匹配錯誤:
必需的 A 找到的串列[A]
ls(2) 不應該已經回傳元素型別嗎?
uj5u.com熱心網友回復:
這個問題的簡單答案是使用lift:
def third_list[A](ls: List[A]): Option[A] =
ls.lift(2)
這將回傳 an,Option因為即使串列沒有三個元素,您也確實希望您的代碼能夠正常作業。處理里面的資料Option或者使用getOrElse來指定一個默認值。
uj5u.com熱心網友回復:
您正在回傳一個具有 A 型別元素的 List,因此您正在回傳一個 List[A] 值,但是您為該方法設定的回傳型別是 A 并且它們不匹配。
uj5u.com熱心網友回復:
third_list您已經宣告了as的回傳型別,但是您正在提取一個( )A型別的元素,將其包裝在一個新串列 (中,然后將其回傳。此外,如果您的代碼中沒有至少 3 個元素,您的代碼將失敗串列。處理該問題的一種方法可能是回傳一個而不是一個. 類似于以下內容:Als(2)List(ls(2))Option[A]A
def third_list[A](ls: List[A]): Option[A] = ls match {
case _ :: _ :: third :: _ =>
Some(third)
case _ =>
None
}
編輯:
用于處理不存在第三個元素的場景是理想的方法Option,因為它告訴此方法的呼叫者不能保證它回傳A.
但是,如果您必須保留原始方法簽名,則可以在不存在第三個元素的情況下拋出例外:
def third_list[A](ls: List[A]): A = ls match {
case _ :: _ :: third :: _ =>
third
case _ =>
throw new RuntimeException(s"Error occurred access third element of list. List had length ${ls.length}.")
}
或者,如果無法訪問第三個元素,則可以要求方法的呼叫者提供默認值,但在這種情況下,您將再次更改方法簽名,因此Option建議:
def third_list[A](ls: List[A], default: => A): A = ls match {
case _ :: _ :: third :: _ =>
third
case _ =>
default
}
值得重申的是,將回傳型別設為型別Option仍然是最佳實踐方法。請參閱有關功能錯誤處理的官方 Scala 語言檔案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/453084.html
標籤:斯卡拉
上一篇:避免在測驗檔案中實體化物件
