扩展另一种结构类型的结构类型

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 子句。反之亦然。

这当然有点同义反复,因为它没有说明规范不允许的原因。似乎这里没有深入的理解,只是那不是你被允许编写类型的方式。您应该能够以另一种方式表达相同的意图。