![](/img/trans.png)
[英]In scala, How to call generalised copy function of a case class if it is declared in a family outer type? - Part 2
[英]In scala, How to call generalised copy function of a case class if it is declared in a family outer type?
這是由路徑依賴類型引起的 scala 問題:考慮到我有一個家庭類型:
trait Outer {
case class Inner(v: Int) {
val outer = Outer.this
}
}
如果我想在Outer
的實例未知時調用Outer#Inner.copy()
:
def cp(src: Outer#Inner) = {
src.copy()
}
我會遇到編譯錯誤。 因為 src.copy() 的類型簽名附加到其外部實例。
繞過這個的一種方法是手動提取外部實例:
def cp(src: Outer#Inner) = {
val o = src.outer
val _src = src.asInstanceOf[o.Inner]
_src.copy()
}
這可以成功編譯,但asInstanceOf[]
顯然是一個黑客制品,應該被刪除。
在慣用的 scala 中,實現相同目標的最佳方法是什么,同時讓 scala 編譯器自動推斷outer
的存在,並在沒有盲目類型轉換的情況下生成正確的類型簽名?
而不是Outer#Inner
,您需要使用類型參數來約束Outer
類型。 嘗試
def cp[O <: Outer](src: O#Inner): O#Inner = src.copy()
這將讓您維護O#Inner
,它指的是一種特定類型,而不是Outer#Inner
。
在Scastie中看到它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.