特征中的隐式val与类型注释的行为不同

时间:2012-07-09 21:01:48

标签: scala

只是想知道以下是错误还是功能:

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

编译器不应该在这里抱怨吗?为什么类型注释会有所作为?如果我们使用此特征实例化某些内容,tnull

2 个答案:

答案 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}