Во-первых, краткое описание. Похоже, что если я помещу неявный для какого-либо другого типа в объект-компаньон и импортирую его в область видимости класса, он не будет найден во время неявного разрешения, пока он не будет указан явно один раз (или определен выше класса). Пример ниже.Ошибка компилятора Implicits?
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
}
}
Я вроде предполагая, на данный момент я нашел ошибку компилятора, поэтому я открою JIRA против Scala, но в то же время мне интересно, если кто-нибудь здесь знает, если это, как ожидается, , или если у вас уже есть открытая ошибка?
редактировать: https://issues.scala-lang.org/browse/SI-7830
edit2: удален «: А» Тип декларации от всех фактических и по умолчанию вальса, чтобы правильно воссоздать мой вопрос.
1. Не открывайте проблемы JIRA, прежде чем вы подтвердите, что это настоящая проблема. 2. Можете ли вы опубликовать рабочий пример, демонстрирующий вашу проблему? Потому что я просто попытался вставить некоторые значения, и он работал, как ожидалось. http://ideone.com/oELulq –
Хорошо стреляйте, здесь есть одна разница между тем, что я опубликовал, и моим фактическим кодом. Если вы удалите: A из всех фактических объявлений и объявлений по умолчанию, это теперь работает, как я описал выше. –
http://ideone.com/1Vtepf для выпуска –