Почему при вызове метода с ограниченным признаком не ищутся самостоятельные типы? - PullRequest
1 голос
/ 22 марта 2011

Предполагая

trait A { def t : Int }
trait B { this: A => }

, почему компилятор "не знает", что я могу вызвать t на B?

def test(b: B): Int = b.t // doesn't work

, но я (видимо излишне?) нужно сделать

def test(b: B with A): Int = b.t

1 Ответ

4 голосов
/ 22 марта 2011

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
...