我定义了两个类:
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 B
和Class[_ <: B] = class B
是什么意思?为什么第一个不起作用,Class[_ <: A] = class B
似乎说它也是B类?
答案 0 :(得分:1)
让我们分开表达式Class[_ <: A] = class B
。第一部分Class[_ <: A]
告诉您编译器在编译时知道什么,b.method1.getClass
返回类型为Class[_ <: A]
的内容。第二部分class B
提到您有一个类B
作为值,但编译器不知道这一点。这是运行时信息。
this.type
专门针对子类的方法,其中从普通this
推断出的类型不是。