扩展另一种结构类型的结构类型
structural type extending another structural type
为什么不允许以下内容? (2.12):
type Foo <: {def foo(): Unit}
type Bar <: {def bar(): Unit} with Foo
我觉得很自然,Bar
应该同时具有 foo()
和 bar()
。
type Foo <: {def foo(): Unit}
是 type Foo <: AnyRef{def foo(): Unit}
.
因此,虽然 type Bar <: {def bar(): Unit} with Foo
不可解析,但使用 AnyRef
和不同的顺序它可以工作
type Foo <: {def foo(): Unit}
type Bar <: Foo with AnyRef{def bar(): Unit}
val b: Bar = ???
b.foo()
b.bar()
也可以使用括号(和直接顺序)
type Foo <: {def foo(): Unit}
type Bar <: ({def bar(): Unit}) with Foo
val b: Bar = ???
b.foo()
b.bar()
实际上 type Bar <: {def bar(): Unit} with Foo
违反规范,而 type Bar <: ({def bar(): Unit}) with Foo
满足规范,因为 {def bar(): Unit}
不是 SimpleType
但 ({def bar(): Unit})
是 SimpleType
.
CompoundType ::= AnnotType {‘with’ AnnotType} [Refinement]
| Refinement
AnnotType ::= SimpleType {Annotation}
SimpleType ::= ............
| ‘(’ Types ‘)’
Types ::= Type {‘,’ Type}
Type ::= ...........
| CompoundType
| ...........
https://scala-lang.org/files/archive/spec/2.13/03-types.html#compound-types
似乎可以使用括号
scala> type Foo <: {def foo(): Unit}
| type Bar <: ({def bar(): Unit}) with Foo
type Foo
type Bar
规范不允许这样做,规范将 { ...}
部分称为细化,可能都包含 with 子句。反之亦然。
这当然有点同义反复,因为它没有说明规范不允许的原因。似乎这里没有深入的理解,只是那不是你被允许编写类型的方式。您应该能够以另一种方式表达相同的意图。
为什么不允许以下内容? (2.12):
type Foo <: {def foo(): Unit}
type Bar <: {def bar(): Unit} with Foo
我觉得很自然,Bar
应该同时具有 foo()
和 bar()
。
type Foo <: {def foo(): Unit}
是 type Foo <: AnyRef{def foo(): Unit}
.
因此,虽然 type Bar <: {def bar(): Unit} with Foo
不可解析,但使用 AnyRef
和不同的顺序它可以工作
type Foo <: {def foo(): Unit}
type Bar <: Foo with AnyRef{def bar(): Unit}
val b: Bar = ???
b.foo()
b.bar()
也可以使用括号(和直接顺序)
type Foo <: {def foo(): Unit}
type Bar <: ({def bar(): Unit}) with Foo
val b: Bar = ???
b.foo()
b.bar()
实际上 type Bar <: {def bar(): Unit} with Foo
违反规范,而 type Bar <: ({def bar(): Unit}) with Foo
满足规范,因为 {def bar(): Unit}
不是 SimpleType
但 ({def bar(): Unit})
是 SimpleType
.
CompoundType ::= AnnotType {‘with’ AnnotType} [Refinement]
| Refinement
AnnotType ::= SimpleType {Annotation}
SimpleType ::= ............
| ‘(’ Types ‘)’
Types ::= Type {‘,’ Type}
Type ::= ...........
| CompoundType
| ...........
https://scala-lang.org/files/archive/spec/2.13/03-types.html#compound-types
似乎可以使用括号
scala> type Foo <: {def foo(): Unit}
| type Bar <: ({def bar(): Unit}) with Foo
type Foo
type Bar
规范不允许这样做,规范将 { ...}
部分称为细化,可能都包含 with 子句。反之亦然。
这当然有点同义反复,因为它没有说明规范不允许的原因。似乎这里没有深入的理解,只是那不是你被允许编写类型的方式。您应该能够以另一种方式表达相同的意图。