Допустимо иметь абстрактный тип, как показано.
REPL находится в специальном режиме синтаксического анализа, где он знает, является ли текущая строка полным синтаксическим производством или если требуется больше ввода, поэтому переходит ко второй строке, хотя технически он должен просто принять type a
.
scala> object X { type a }
defined object X
scala> object X { def x: Int }
^
error: only traits and abstract classes can have declared but undefined members
scala> type a
| 42
defined type alias a
res0: Int = 42
scala> def x: Int
| 42
^
error: only traits and abstract classes can have declared but undefined members
. REPL не импортирует абстрактный typedef в текущее выражение, потому что знает, что он абстрактный.
Тип может быть не очень полезным, но это вещь:
scala> object X { type a }
defined object X
scala> val x: X.a = null.asInstanceOf[X.a]
x: X.a = null
scala> def x: X.a = ???
x: X.a
scala> def x: X.a = null
^
error: type mismatch;
found : Null(null)
required: X.a