4

首先,简短的描述。似乎如果我在伴生对象中为其他类型添加一个隐式并将该隐式导入到类的范围内,则在隐式解析期间找不到它,直到它被显式引用一次(或在类上方定义)。下面的例子。

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,但同时我想知道这里是否有人知道这是否是预期的,或者是否已经打开这个错误?

编辑:https ://issues.scala-lang.org/browse/SI-7830

edit2:从所有实际和默认值中删除“:A”类型声明以正确重新创建我的问题。

4

1 回答 1

3

抱歉,在有规范的情况下,这是“按规定”。“规范”被埋在五年前的一张票的评论中。https://issues.scala-lang.org/browse/SI-801

于 2013-09-10T20:18:36.577 回答