Scala 它的编译器错误是什么?
首先,简短的描述。看起来,如果我在一个伴生对象中为其他类型放入一个隐式,并将该隐式导入到类的作用域中,那么在隐式解析过程中,直到显式引用一次(或在类上方定义)它才会找到它。下面的例子Scala 它的编译器错误是什么?,scala,implicit-conversion,implicit,Scala,Implicit Conversion,Implicit,首先,简短的描述。看起来,如果我在一个伴生对象中为其他类型放入一个隐式,并将该隐式导入到类的作用域中,那么在隐式解析过程中,直到显式引用一次(或在类上方定义)它才会找到它。下面的例子 class A(val a: Something) object A { implicit val default = ... //found by default } object B { def func(fn: => T)(implicit a: A) = ... } class Brok
class A(val a: Something)
object A {
implicit val default = ... //found by default
}
object B {
def func(fn: => T)(implicit a: A) = ...
}
class Broken {
def doSomething = {
import Broken._ // or Broken.actual
B.func { ... } // Uses A.default, not Broken.actual for implicit
}
}
object Broken {
implicit val actual = ...
}
class Fixed {
def doSomething = {
import Fixed._
println(actual) //reference actual
B.func { ... } // uses Fixed.actual
}
}
object Fixed {
implicit val actual = ...
}
object WTF {
implicit val actual = ...
}
class WTF {
def doSomething = {
import WTF._
B.func { ... } // With object definition first this works without referencing actual
}
}
我假设在这一点上我发现了一个编译器错误,所以我将针对Scala打开一个jira,但同时我想知道这里是否有人知道这是预期的,或者是否已经有一个开放的错误
编辑:
edit2:已删除:所有实际和默认VAL的“类型声明”,以正确地重新创建我的问题。对不起,这是“指定的”,因为有规范。“规格”隐藏在五年前的一张罚单的评论中 一,。在你确认这是一个真正的问题之前,不要打开JIRA问题。2.你能发布一个工作实例来说明你的问题吗?因为我刚刚试着插入了一些值,结果一切正常。好吧,我发布的代码和我的实际代码之间有一个区别。如果从所有实际声明和默认声明中删除:A,现在就可以像我上面描述的那样工作了。对于Issuew。简而言之,将对象放在使用来自对象的隐式解析的类之前会更改隐式解析。狂野!一定是错了,对吧?我还尝试了
对象Main
之外的类,因为对象具有初始化顺序;不确定包源是否应该具有相同的概念,但我猜是这样的。在我的实际代码中,A和B在一个包中,break/etc在另一个包中。嗯,所以我确实看到了与我所看到的类似的东西。这里有一些“this not compile”的例子,如果我从上面的例子中去掉隐式默认值,这就是一个问题。我的问题是相当隐蔽的,因为如果我有一个默认的隐式,它会找到它,我的程序会编译,而且似乎可以工作!也许在我的例子中,它会被重新审视,但谁知道呢。@WilliamThurston有一个关于含糊不清的隐式(或其他)的警告,它说“某某不适用,因为它来得晚,并且没有显式的结果类型。”所以通常我总是写结果类型,但坦率地说,当我看到这个问题时,我没有想到这一点。(我应该说,“……我的思想,它还剩下什么。”)从正面看,我感觉到一个谜题正在出现。Scala bug来来去去,但谜题是时代的产物。不幸的是,正如您所指出的,这似乎是意料之中的。我甚至没有从上面代码的编写方式中得到编译器警告:(也许有一天我会去看看Scala的内部结构,并向自己证明为什么会这样。鉴于Jira也关闭了,我想我只需要处理它。