运维开发网

Scala类型类,用于获取类型成员的最具体类型

运维开发网 https://www.qedev.com 2020-07-25 17:36 出处:网络 作者:运维开发网整理
请考虑以下 Scala代码: trait Elem class MyElem extends Elem trait Holder { type EP <: Elem def get: EP } class MyHolder(e: MyElem) extends Holder { type EP = MyElem def get = e } 根据我是否有对象类型的Holder或M
请考虑以下 Scala代码:

trait Elem
class MyElem extends Elem

trait Holder {
  type EP <: Elem
  def get: EP
}

class MyHolder(e: MyElem) extends Holder {
  type EP = MyElem
  def get = e
}

根据我是否有对象类型的Holder或MyHolder,调用get可以分别返回Elem或MyElem.我试图在类型级别提供该信息,但我没有得到任何结果.例如,考虑一个像这样的Getter类型:

trait Getter[From] {
  type Out
  def get(from: From): Out
}

object Getter {
  type Aux[From, Out0] = Getter[From] { type Out = Out0 }

  def apply[From](implicit getter: Getter[From]): Getter.Aux[From, getter.Out] = getter

  // some way to create a `Getter[H <: Holder]`
  // where `Out` is the most specific type known for `H#EC`
}

Getter[MyHolder] // should return a MyHolder { type Out = MyElem }
Getter[Holder] // should return a Holder { type Out = Elem }

我正在尝试为片段中的Getter [H<:Holder]创建隐式构造函数,但即使我尝试了几种约束类型的方法,我也没有得到任何适用于上述两个示例的结果. 这可能与Scala编译器有关吗?从无形或scalaz的任何类型类帮助我做到这一点?

你问的问题听起来像 Path Dependent Types的应用

其中,您可以根据某些特征/类中定义的类型键入内容,而无需了解具体实现:

val x: Holder#EP = ???

我希望这就是你要找的东西,如果不是我害怕我不完全理解你的问题.

0

精彩评论

暂无评论...
验证码 换一张
取 消