问题描述
由于两个 Scala 编译器限制,我遇到了问题
-
如果您想编写实现需要构造具体类型的常见行为的特征,则不可能引用 this 的类型(出于明显的原因,this.type 不是 it)。解决此问题的推荐模式是
trait Foo[SelfType <: Foo[SelfType]] { this: SelfType => final def foo: SelfType = newInstance(??? /*do some work*/) protected def newInstance(i: Int): SelfType }
-
Scala 编译器(在 Dotty AFAIK 中修复)不跟踪存在类型的边界(我发现至少有 3 个从 2009 年及以后的 Scala github 项目中提交的错误)。这意味着,鉴于上述类型,如果我要编写一个采用一些未知 Foo 的方法
def process(f: Foo[_])
在某些情况下,我可能会遇到一些奇怪的错误编译器行为。相反,我需要手动向编译器表示 _ 此处遵守类型边界以解决其限制。为此,我需要做类似的事情
def process[F <: Foo[F]](f: Foo[F])
并在不传递任何类型参数的情况下调用该方法,这有望正确捕获它。但是,如果 Foo 使用其他类型的参数,这会给客户端带来很多负担,这会使 def 签名变得非常麻烦。所以我的问题是,是否可以使用类型定义作为简写来正确表达这种自引用类型。例如。我尝试了各种方法。
type SomeFoo = Foo[SelfType] with SelfType forSome { type SelfType <: Foo[SelfType] }
但这似乎并没有做到。不知何故,编译器没有意识到 SelfType 是同一个未知类型 SomeFoo。
我希望这是有道理的。谢谢你的帮助。附注随时建议重命名问题,因为现在还不是很清楚。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)