簡體   English   中英

Scala遞歸類型別名錯誤

[英]Scala recursive type alias error

我有幾個函數,它們的唯一參數要求是它具有某種可增長的集合(即它可以是Queue,List,PriorityQueue等),因此我嘗試創建以下類型別名:

type Frontier = Growable[Node] with TraversableLike[Node, Frontier]

與以下函數定義一起使用:

def apply(frontier: Frontier) = ???

但是類型別名返回錯誤“涉及類型Frontier的非法循環引用”。 有什么方法可以解決非法循環引用以使用類型別名或類似的東西嗎?

一種解決方案是使用以下方法:

def apply[F <: Growable[Node] with TraversableLike[Node, F]](f: F) = ???

但這似乎在函數定義看起來與類型別名完全相同時增加了不必要的冗長性。 該類型還在其他地方使用,因此類型別名將大大提高可讀性。

根據規范第4.3節:

定義(第4節)和類型參數(第4.6節)的范圍規則使類型名稱可以出現在其自身的邊界或右側。 但是,如果類型別名遞歸引用已定義的類型構造函數本身,則這是一個靜態錯誤。

因此,沒有辦法,無法直接執行此操作,但是您可以使用類型別名上的類型參數來完成很多相同的事情:

type Frontier[F <: Frontier[F]] = Growable[Int] with TraversableLike[Int, F]

現在,您只需像下面這樣編寫您的apply

def apply[F < Frontier[F]](frontier: F) = ???

仍然比假設的第一個版本更冗長,但比完整地寫出來要短。

您也可以只將通配符速記用於存在類型:

type Frontier = Growable[Node] with TraversableLike[Node, _]

現在,您的第一個apply 照原樣工作。 您只是在說必須有適合該插槽的某種類型,但您不在乎它是什么。

但是,在這種情況下,具體來說,您是否有理由不使用Traversable[Node]嗎? 它實際上會完成相同的事情,並且不會在其表示類型上進行參數化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM