为什么 Scala 在有换行符且没有等号时评估类型别名?
Why does scala evaluate a type alias when it has a line break and no equals sign?
我注意到在 REPL 中声明类型别名时,换行符导致语句成功:
这个有效:
scala> type a
| 3 == 3
defined type alias a
res32: Boolean = true
这不是:
scala> type a 3 == 3 ^
error: `=`, `>:`, or `<:` expected
具有如图所示的抽象类型是合法的。
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 不会将抽象类型定义导入当前表达式,因为它知道它是抽象的。
类型可能不是很有用,但它是一回事:
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
我注意到在 REPL 中声明类型别名时,换行符导致语句成功:
这个有效:
scala> type a
| 3 == 3
defined type alias a
res32: Boolean = true
这不是:
scala> type a 3 == 3 ^
error: `=`, `>:`, or `<:` expected
具有如图所示的抽象类型是合法的。
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 不会将抽象类型定义导入当前表达式,因为它知道它是抽象的。
类型可能不是很有用,但它是一回事:
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