只是想知道以下是错误还是功能:
Welcome to Scala version 2.10.0-M3 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0).
Type in expressions to have them evaluated.
Type :help for more information.
scala> class TypeClass[T]
defined class TypeClass
scala> trait A[T] {
| implicit val t = implicitly[TypeClass[T]]
| }
<console>:9: error: could not find implicit value for parameter e: TypeClass[T]
implicit val t = implicitly[TypeClass[T]]
^
正如预期的那样,这不会编译,因为T
没有约束。但是当我添加一个类型注释时,它会编译:
scala> trait A[T] {
| implicit val t: TypeClass[T] = implicitly[TypeClass[T]]
| }
defined trait A
编译器不应该在这里抱怨吗?为什么类型注释会有所作为?如果我们使用此特征实例化某些内容,t
为null
。
答案 0 :(得分:5)
实际上,你只是在这里做自己。 : - )
您刚刚声明隐式TypeClass[T]
是val t
。也就是val t = t
,它使它为空。哎哟!
T
是抽象的,因此编译器无法为其提供TypeClass
。您必须使用T
参数获取该值,但您无法使用trait
。在class
中,将其设为T : TypeClass
。
答案 1 :(得分:2)
我说它既不是bug也不是功能,只是某些功能的结果。
在第一个示例中,范围中没有类型TypeClass[T]
的隐式值。您依赖类型推断来了解t
的类型,并且因为在编译时解析了implicits,所以未定义t
的类型,因为无法找到隐式值。
在第二个例子中,范围内有一个合适的隐含值,即t
。如果您一般不允许这种行为,则无法执行递归定义,如:
val fibs: Stream[Int] = 0 #:: 1 #:: fibs.zip(fibs.tail).map{case (x,y) => x+y}