Scala 是否可以使用隐式证据强制抽象类型之间的静态类型兼容性?

Scala 是否可以使用隐式证据强制抽象类型之间的静态类型兼容性?,scala,Scala,假设具有以下特征: trait A { type B def +(a:A):A } 我使用抽象类型是因为我不想每次需要A时都在类型签名中拖拽B。 是否仍然可以添加任何隐式证据(使用=:=,无需隐式证据…您可以使用显式优化 trait A { self => type Self = A { type B = self.B } type B def +(a : Self) : Self } (请注意,使用自类型注释为外部“this”提供别名,允许在自类型定义中区分已

假设具有以下特征:

trait A {
  type B
  def +(a:A):A
}
我使用抽象类型是因为我不想每次需要A时都在类型签名中拖拽B。
是否仍然可以添加任何隐式证据(使用=:=,无需隐式证据…您可以使用显式优化

trait A {
  self =>
  type Self = A { type B = self.B }
  type B
  def +(a : Self) : Self
}
(请注意,使用自类型注释为外部“this”提供别名,允许在自类型定义中区分已定义和正在定义的B)

答复全文

scala> trait A { self => type Self = A { type B = self.B } ; type B ; def +(a : Self) : Self }
defined trait A

scala> val ai = new A { type B = Int ; def +(a : Self) : Self = this }
ai: java.lang.Object with A{type B = Int} = $anon$1@67f797

scala> val ad = new A { type B = Double ; def +(a : Self) : Self = this }
ad: java.lang.Object with A{type B = Double} = $anon$1@7cb66a

scala> ai + ai
res0: ai.Self = $anon$1@67f797

scala> ad + ad 
res1: ad.Self = $anon$1@7cb66a

scala> ai + ad
<console>:9: error: type mismatch;
 found   : ab.type (with underlying type java.lang.Object with A{type B = Double})
 required: ai.Self
       ai + ab
scala>trait A{self=>type self=A{type B=self.B};type B;def+(A:self):self}
定义特征A
scala>valai=newa{typeb=Int;def+(A:Self):Self=this}
ai:java.lang.Object,其{type B=Int}=$anon$1@67f797
scala>valad=newa{typeb=Double;def+(A:Self):Self=this}
ad:java.lang.Object,其{type B=Double}=$anon$1@7cb66a
scala>ai+ai
res0:ai.Self=$anon$1@67f797
scala>ad+ad
res1:ad.Self=$anon$1@7cb66a
scala>ai+ad
:9:错误:类型不匹配;
找到:ab.type(底层类型为java.lang.Object,类型为{type B=Double})
必需:ai.Self
ai+ab

我不敢相信编译器不会抱怨循环!结构优化是否也依赖于运行时的反射?只有当优化提供了一个新的非类型定义,而该定义在它的标称超类型中不存在时,才会涉及运行时反射(见SLS 3.2.7).这里不会发生这种情况,所以,不,不涉及运行时反射。您可以通过使用javap来验证这一点。非常巧妙的技巧。如果使用sameb或其他名称重命名Self,可能会更清楚。