如何在 Scala 中正确地使用存在 (forSome) 用例的类型定义来表达自引用类型

问题描述

由于两个 Scala 编译器限制,我遇到了问题

  1. 如果您想编写实现需要构造具体类型的常见行为的特征,则不可能引用 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
    }
    
  2. 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 (将#修改为@)