Простой пример, чтобы проиллюстрировать, что здесь происходит (в REPL):
object A
def foo(a : A) = "Does not compile"
def bar(a : A.type) = "Does compile!"
bar(A) // returns "Does compile!"
Как говорит Николас, Inner - это не тип, поэтому его нельзя использовать как таковой.
Пытаясь понять вашу мотивацию, я придумал что-то вроде этого:
class Outer(i : Int) {
object Inner {
def getI : Int = i
}
def foo(x : Inner.type) = x.getI
}
Это немного бессмысленно, так как мы будем просто ссылаться на Внутренний - в конце концов, есть только один из них:
class Outer(i : Int) {
object Inner {
def getI : Int = i
}
def foo = Inner.getI
}
Я предполагаю, что вы хотите принять Иннер из любого экземпляра Внешнего. Мы можем проверить тип такой вещи:
val o = new Outer(1)
:type o.Inner
o.Inner.type
Так что мы можем ожидать, что сможем сделать что-то вроде этого:
class Outer(i : Int) {
object Inner {
def getI : Int = i
}
def foo(x : Outer#Inner.type) = x.getI
}
Это, однако, не компилируется. Я не уверен почему. Введите псевдонимы на помощь!
class Outer(i : Int) {
type Inner = Inner.type
object Inner {
def getI : Int = i
}
def foo(x : Outer#Inner) = x.getI
}
val a = new Outer(1)
val b = new Outer(2)
a.foo(b.Inner) //returns 2
Я предполагаю, что это просто ограничение синтаксического анализатора, что он не может прочитать что-то вроде A#B.type
. Вы можете отправить запрос об ошибке.