Я застрял примерно на час, чтобы обнаружить этот факт:
class Foo {
trait TypeClass[X]
object TypeClass {
implicit val gimme = new TypeClass[Int]{}
}
def foo[X : TypeClass](p: X): Unit = println("yeah " + p)
}
// compiles
val foo = new Foo()
foo.foo(4)
//does not compile
new Foo().foo(4)
could not find implicit value for evidence parameter of type _1.TypeClass[Int]
[error] new Foo().foo(4)
[error]
Я не могу понять, почему это так. Единственное, о чем я могу думать, так это о том, что scalac не находит неявные значения внутри типа, у которого нет типа значения, доступного для любого префикса. На него нельзя ссылаться. Очевидно, Scalac должен получить доступ к этому Foo.this.foo
, чтобы разрешить в нем имплициты, чего в данном случае он не может.
Я чувствую, что если вы комбинируете классы типов и типы, зависящие от пути, вы фактически обречены. В конце концов, вы будете иметь дело с такими вещами. Я сделал это, потому что в противном случае scalac не вывел бы типы в моих методах API, и пользователю пришлось бы объявлять их явно. Поэтому я выбрал такой дизайн, чтобы типы конструировались в Foo[T]
, а методы API использовали существующий тип, но я столкнулся с несколькими действительно уродливыми проблемами и ошибками такого рода, из-за которых мое приложение выглядело как перегруженное дерьмо...