关于在scala中使用this.type

时间:2015-12-16 09:30:48

标签: scala

我定义了两个类:

class A { def method1 = this }
class B extends A { def method2 = this }

val b = new B

然后我检查了b.method1的类型:

scala> b.method1.getClass
res29: Class[_ <: A] = class B

在这种情况下,我无法使用b.method1.method2

scala> b.method1.method2
<console>:11: error: value method2 is not a member of A
              b.method1.method2

所以我必须像这样定义A和B:

class A { def method1: this.type = this } 
class B extends A { def method2: this.type = this } 

val b = new B

现在我检查b.method1的类型:

scala> b.method1.getClass
res31: Class[_ <: B] = class B

此处b.method1.method2有效:

scala> b.method1.method2
res32: b.type = B@4ff3ac

我的问题是Class[_ <: A] = class BClass[_ <: B] = class B是什么意思?为什么第一个不起作用,Class[_ <: A] = class B似乎说它也是B类?

1 个答案:

答案 0 :(得分:1)

让我们分开表达式Class[_ <: A] = class B。第一部分Class[_ <: A]告诉您编译器在编译时知道什么,b.method1.getClass返回类型为Class[_ <: A]的内容。第二部分class B提到您有一个类B作为值,但编译器不知道这一点。这是运行时信息。

this.type专门针对子类的方法,其中从普通this推断出的类型不是。