2016-05-04 3 views
0

Мой вопрос прост.Scala: Тип соответствия псевдонима типа с верхней границей

Почему этот код делает ошибку,

abstract class A { 
    type T <: A.Inner 
    def toT: T = new A.Inner(this) 
} 

object A { 
    class Inner(a: A) 
} 

// Exiting paste mode, now interpreting. 

<console>:16: error: type mismatch; 
found : A.Inner 
required: A.this.T 
     def toT: T = new A.Inner(this) 
        ^

тогда этот код не?

abstract class A { 
    type T = A.Inner 
    def toT: T = new A.Inner(this) 
} 

object A { 
    class Inner(a: A) 
} 

// Exiting paste mode, now interpreting. 

defined class A 
defined object A 

A.Inner <: A.Inner. Не так ли?

ответ

2

Здесь следует использовать Нижнюю границу:

abstract class A { 
    type T >: A.Inner 
    def toT: T = new A.Inner(this) 
} 

object A { 
    class Inner(a: A) 
} 

Только если T является предком A.Inner, то A.Inner может быть преобразован в T. Мы используем нижнюю границу для ограничения T является предком A.Inner.

+0

ОК. Кажется, я не привык к контравариантности ... – Naetmul

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