Self-типы не являются частью контракта черты или класса. То есть они не предоставляют внешне видимых ограничений для черты или класса, только внутренне видимых. Self-типы проверяются во время создания объекта, но в противном случае их можно использовать только с помощью декларируемой черты или любых наследующих черт / классов / объектов. В терминах Java вы могли бы думать о самом типе как о чем-то вроде protected interface
, объявленном чертой (хотя Java, конечно, на самом деле не поддерживает такую вещь).
Если бы вы хотели, чтобы ваш тест работал, вам нужно было бы сделать зависимость B от A внешне видимой. Это делается с помощью объявления «extends», простого подкласса
trait A { def t : Int }
trait B extends A
def test( b: B ) : Int = b.t