我将如何转换:
trait Foo[A <: Foo[A]]
Run Code Online (Sandbox Code Playgroud)
一个类型的成员?
也就是说,我想要的东西如下:
trait Foo {
type A <: Foo {type A = ???}
}
Run Code Online (Sandbox Code Playgroud)
但我遇到了困难,因为名称A已经在类型细化中被采用.这个问题类似(并衍生自):通过类型成员而不是类型参数进行F限制量化?
types scala parametric-polymorphism type-members bounded-quantification
虽然在另一个问题上开头,但我遇到了似乎相关的不同谜语.这是其中之一:
trait Sys[S <: Sys[S]] {
type Peer <: Sys[Peer]
}
trait Fenced {
type Peer <: Sys[Peer]
}
def makeFence[S <: Sys[S]] = new Fenced { type Peer = S#Peer }
Run Code Online (Sandbox Code Playgroud)
错误如下:
error: overriding type Peer in trait Fenced with bounds >: Nothing <: Sys[this.Peer];
type Peer has incompatible type
def makeFence[S <: Sys[S]] = new Fenced { type Peer = S#Peer }
^
Run Code Online (Sandbox Code Playgroud)
为什么?(也试图自我类型添加_:S =>到Sys,没有问题)
虽然Rex的答案使得构造Fenced对象成为可能,但它并没有真正解决我在使用类型投影(S#Peer)时表示类型字符丢失的问题.我想出了另一种造成更严格限制的情景; 我认为这是核心问题:
trait …Run Code Online (Sandbox Code Playgroud) types scala abstract-type type-projection bounded-quantification
以下为什么不工作?
scala> abstract class Foo[B<:Foo[B]]
defined class Foo
scala> class Goo[B<:Foo[B]](x: B)
defined class Goo
scala> trait Hoo[B<:Foo[B]] { self: B => new Goo(self) }
<console>:9: error: inferred type arguments [Hoo[B] with B] do not conform to class Goo's type parameter bounds [B <: Foo[B]]
trait Hoo[B<:Foo[B]] { self: B => new Goo(self) }
^
scala> trait Hoo[B<:Foo[B]] extends Foo[B] { new Goo(this) }
<console>:9: error: inferred type arguments [Hoo[B]] do not conform to class Goo's type parameter bounds [B …Run Code Online (Sandbox Code Playgroud) 我有一个F-bounded类型Sys:
trait Sys[S <: Sys[S]]
Run Code Online (Sandbox Code Playgroud)
以及将其作为类型参数的一些特征:
trait Foo[S <: Sys[S]]
Run Code Online (Sandbox Code Playgroud)
假设我有一个方法可以调用Foo:
def invoke[S <: Sys[S]](foo: Foo[S]) = ()
Run Code Online (Sandbox Code Playgroud)
假设我有一个模型更新类型,以及一个带有以下内容的子类型Foo:
sealed trait Update
case class Opened[S <: Sys[S]](foo: Foo[S]) extends Update
Run Code Online (Sandbox Code Playgroud)
用于注册模型观察者的辅助函数:
def observe(pf: PartialFunction[Update, Unit]) = ()
Run Code Online (Sandbox Code Playgroud)
现在以下失败:
observe {
case Opened(foo) => invoke(foo)
}
Run Code Online (Sandbox Code Playgroud)
同
<console>:16: error: inferred type arguments [Any] do not conform to method invoke's
type parameter bounds [S <: Sys[S]]
case Opened(foo) => invoke(foo)
^
Run Code Online (Sandbox Code Playgroud)
我怎样才能解决部分功能,如Sys,Foo …
scala pattern-matching existential-type type-bounds bounded-quantification