2012-02-06 68 views
6
我在与下面的代码隐式转换问题

Scala的隐式转换问题

trait A { 
    def send(s: String): String = { 
    println(s) 
    s 
    } 
} 

object X { 
    implicit def toB(a: A): B = new B(a) 

    class B(a: A) { 
    def <<(s: String): String = a send s 
    } 
} 

object Y { 
    implicit def toB(a: A): B = new B(a) 

    class B(a: A) { 
    } 
} 

object Test extends App { 
    import X._ 
    import Y._ 
    val a: A = new A {} 
    a << "Test" 
} 

在测试导致的最后一条语句编译错误:

error: value << is not a member of A 
a << "Test" 

但是,如果我从删除import Y._测试,它编译好。

请注意,在真实的代码中,X.B和Y.B都是Scala DSL的Java库的一部分,我希望能够在同一个编译单元中使用它们。

回答

7

它看起来像是发生了什么事是当你在同一个范围内导入两个时,Y.toB重写X.toB。如果我把import Y._之前然后import X._,那么它的工作。此外,如果我将Y的内容重命名为其他内容(例如toYB),则无论您将其放入什么顺序,它都能正常工作。

+3

这就是您所期望的。这就像Java中的静态导入。如果将隐式方法作为'toB(a)'调用,那么编译器如果知道后者没有覆盖另一个,那么它将如何知道您的意思? OP应该给你隐含的defs名称,像'AtoXB'和'AtoYB'就像你说的,因为'X.B'和'Y.B'是不同的类。 – 2012-02-06 13:36:20

+0

确实,我不知道隐式方法名称会导致问题。我已经重新命名,现在工作正常,谢谢! – elk 2012-02-06 13:44:18