1

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

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

4

2 回答 2

5

实际上,您只是在这里自欺欺人。:-)

您刚刚声明隐式TypeClass[T]is val t。也就是说,val t = t,这使它为空。哎哟!

T是抽象的,所以编译器不能TypeClass为它提供一个。您必须使用T参数来获取它,但您将无法在trait. 中class,做出来T : TypeClass

于 2012-07-09T21:27:24.610 回答
2

我想说这既不是错误也不是功能,只是某些功能的结果。

在第一个示例中,范围内没有类型TypeClass[T]的隐式值。您依靠类型推断来知道 of 的类型,t并且由于隐式在编译时已解决,t因此由于找不到隐式值,因此未定义 of 的类型。

在第二个示例中,范围中有一个合适的隐式值,即t. 如果您通常不允许这种行为,则无法进行递归定义,例如:

val fibs: Stream[Int] = 0 #:: 1 #:: fibs.zip(fibs.tail).map{case (x,y) => x+y}
于 2012-07-09T21:36:40.720 回答