2012-08-26 126 views
5

如何解決兩個路徑依賴類型的等價問題,我知道它們是相同的,但編譯器不相同?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]) 
+0

也許像'def fromMacroTree [T <:Tree](tree:T):T = ???'和'fromMacroTree [tree.type](tree)'有幫助嗎? – sschaef

+0

我想這兩個''樹都有一些常見的超類型,試過了嗎? – pedrofurla

+0

@sschaef我得到的錯誤:'類型參數[c.universe.Tree]不符合來自MacroTree的類型參數邊界的方法[T <:bridge.context.universe.Tree]' –

回答

9

我可以在下面做工作:

case class MacroBridge[C <: Context](context: C) { 
    def fromMacroTree(tree: context.universe.Tree): context.universe.Tree = ??? 
} 

trait MB { 
    def meth(c: Context) { 
    val bridge = MacroBridge[c.type](c) 
    def fromMacroTree(tree: c.universe.Tree): c.universe.Tree = 
     bridge.fromMacroTree(tree) 
    } 
} 

我有幾乎same problem前一段時間。

+0

'val bridge = treehugger.MacroBridge [c .type](c)'是答案。謝謝! –