[英]None type in Priority queue scala
我正在使用優先級隊列來命令一個名為TreeNodeWithCostAndHeuristic的案例類
case class TreeNodeWithCostAndHeuristic[S,A](parent:Option[TreeNodeWithCostAndHeuristic[S,A]],
action: Option[A],
state: S,
cost: Double,
estimatedRemainingCost: Double)
此優先級隊列在函數內創建,該函數使用其參數設置初始狀態,而其他值必須保持為None或0
def HeuristicGraphSearch[S,A](problem: ProblemWithCostAndHeuristic[S,A]) = {
val root = TreeNodeWithCostAndHeuristic(parent = None,action=None,state=problem.initialState,cost = 0.0, estimatedRemainingCost = 0.0)
val frontier : mutable.PriorityQueue[TreeNodeWithCostAndHeuristic[S,A]] = mutable.PriorityQueue.empty[TreeNodeWithCostAndHeuristic[S,A]]
frontier.enqueue(root)
但是因為父和動作都沒有,我得到了預期類型TreeNodeWithCostAndHeuristic[S,A]
與我試圖將TreeNodeWithCostAndHeuristic[S,Nothing]
排隊的不匹配。
據我所知,Nothing是Option的子類型,在我的case類中,parent和action都是選項。 為什么我會遇到不匹配?
它與Scala編譯器推斷類型的方式有關。 簡短的回答是通過在構造case類時明確聲明類型來簡單地幫助它:
val root = TreeNodeWithCostAndHeuristic[S, A](parent = None,action=None,state=problem.initialState,cost = 0.0, estimatedRemainingCost = 0.0)
TreeNodeWithCostAndHeuristic[S, Nothing]
不被認為是TreeNodeWithCostAndHeuristic[S, A]
的有效替代的原因是因為它不是它的子類; 如果是一個,它必須在類型A中是協變的。如果一些Foo[A]
在其類型A
是協變A
,那么只有以下成立: Foo[S] <: Foo[A]
對於任何S
是子類的A
除了sloucs回答,您還可以使用類型歸屬來幫助編譯器:
val root = TreeNodeWithCostAndHeuristic(
parent = None: Option[TreeNodeWithCostAndHeuristic[S, A]],
action = None: Option[A],
state = problem.initialState,
cost = 0.0,
estimatedRemainingCost = 0.0)
編譯器抱怨的原因是它無法保證None.type
是 Option[TreeNodeWithCostAndHeuristic[S, A]]
和Option[A]
,因此它“拯救”並推斷出Nothing
,這就是所有類型的底部類型。
@Dima還建議使用Option.empty[A]
:
val root = TreeNodeWithCostAndHeuristic(
parent = Option.empty,
action = Option.empty[A],
state = problem.initialState,
cost = 0.0,
estimatedRemainingCost = 0.0)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.