如何解決兩個路徑依賴類型的等價問題,我知道它們是相同的,但編譯器不相同?Scala:路徑依賴類型的等價
使用Scala 2.10.0 M7我想將AST從一個宇宙轉換爲另一個宇宙。
case class MacroBridge(context: Context) {
def toMacroTree(tree: treehugger.forest.Tree): context.universe.Tree = ???
def fromMacroTree(tree: context.universe.Tree): treehugger.forest.Tree = ???
}
在一個宏實現,我可以用它爲:
val bridge = treehugger.MacroBridge(c)
def fromMacroTree(tree: c.universe.Tree): Tree = bridge.fromMacroTree(tree)
然而,這會導致一個編譯器錯誤:
[error] /scalamacros-getting-started/library/Macros.scala:21: type mismatch;
[error] found : c.universe.Tree
[error] required: bridge.context.universe.Tree
[error] possible cause: missing arguments for method or constructor
[error] def fromMacroTree(tree: c.universe.Tree): Tree = bridge.fromMacroTree(tree)
在上面的代碼c
顯然是相同的值爲bridge.context
,但可能是因爲它是一個值類型檢查器無法檢查它。把廣義類型的約束並沒有幫助:
def fromMacroTree[A](tree: A)(implicit ev: A =:= context.universe.Tree): Tree =
在此仍然導致一個錯誤的宏:
[error] /scalamacros-getting-started/library/Macros.scala:21: Cannot prove that c.universe.Tree =:= bridge.context.universe.Tree.
[error] def fromMacroTree(tree: c.universe.Tree): Tree = bridge.fromMacroTree(tree)
我需要獲得context.universe
,所以我可以到其他相關的類型,如TermName
。有沒有更好的解決辦法,除了鑄造?:
def fromMacroTree(tree: c.universe.Tree): Tree =
bridge.fromMacroTree(tree.asInstanceOf[bridge.context.universe.Tree])
也許像'def fromMacroTree [T <:Tree](tree:T):T = ???'和'fromMacroTree [tree.type](tree)'有幫助嗎? – sschaef
我想這兩個''樹都有一些常見的超類型,試過了嗎? – pedrofurla
@sschaef我得到的錯誤:'類型參數[c.universe.Tree]不符合來自MacroTree的類型參數邊界的方法[T <:bridge.context.universe.Tree]' –