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也关闭了,我想我只需要处理它。