簡體   English   中英

在 scala 中,如果在家族外部類型中聲明,如何調用案例 class 的通用副本 function?

[英]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.

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