我被困了一个小时才发现这个事实:
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 方法使用现有类型,但是我遇到了几个非常丑陋的问题和此类错误,使我的应用程序看起来像是一个过度设计的废话......