2015-12-16 2 views
0

Я определил два класса:Об использовании this.type в Скале

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 

Так что я должен определить а и в, как это:

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 = [email protected] 

Мой вопрос здесь что это значит, говоря Class[_ <: A] = class B и Class[_ <: B] = class B? И почему первое не работает, поскольку Class[_ <: A] = class B, кажется, говорит, что это также класс B?

+0

'.type' - это одноэлементный тип, специальная концепция в Scala. например '3.type' не' Int', это '3.type', одноэлементный тип, содержащий только номер 3. Трудно быть уверенным, но похоже, вы думаете, что' .type' означает что-то еще. –

ответ

1

Давайте разделим выражение Class[_ <: A] = class B. Первая часть, Class[_ <: A] сообщает вам, что компилятор знает во время компиляции, что b.method1.getClass возвращает что-то типа Class[_ <: A]. Во второй части, class B упоминается, что у вас есть класс B как значение, но компилятор этого не знает. Это информация о времени выполнения.

this.type специализируется на методе для подклассов, где тип, выводимый из простой this, не является.

+0

Большое спасибо! –

Смежные вопросы