0

这只是一个基本示例,但是否可以重写最后一个特征以避免使用 2 类型 (T ,U ) 设置以某种方式仅通过使用 M 来提取或推断 T?我更多地询问没有显式对象的类型系统,但也许这是唯一的方法?

trait Data[T]{
  val x:T
}

trait Meta[T<:Data[T]]{
  val m:T
}

trait Overall[T, M<:Meta[T] ] {
 def review(t:T): M
}

//assume we want to work with the nested data type Int
case class Helper extends Overall[Int,Meta[Int]]

我要问的内容不正确:

//extract T by however Overall is finally defined?
trait Overall[ M<:Meta[T] ] {
    def review(t:T): M
}

case class Helper extends Overall[Meta[Int]]

谢谢

4

2 回答 2

1

我不认为你可以直接派生出你想要的类型。但是,您可以通过将其设置为类型变量来隐藏签名中的类型。

trait Overall[T] {
  type M <: Meta[T]
  def review(t:T): M
}

case class Helper extends Overall[Int] {
  override type M = Meta[Int]
  def review(t: Int): Meta[Int] = null;
}

您仍然必须在子类中声明它,但在使用类时不需要。

于 2013-07-28T06:59:15.703 回答
0

或者您使用类型成员Meta

trait Meta {
  type T <: Data[T] 
  val m: T
}

trait Overall[M <: Meta] {
  def review(t: M#T): M
}

case class IntData(x: Int) extends Data[Int]

case class Helper extends Overall[Meta { type T = IntData }] {
  def review(t: IntData) = ???
}

但是,您确定要定义T <: Data[T]. 因为这没什么意义:

case class Helper extends Overall[Meta { type T = IntData }] {
  def review(t: IntData) = new Meta {
    type T = IntData
    val m = IntData(1234)
  }
}

<console>:14: error: overriding type T in trait Meta with bounds <: Data[this.T];
 type T has incompatible type
           type T = IntData
                ^

这样,定义Data类型的唯一可能性就像

case class IntData() extends Data[IntData] { val x = this } // !?!

case class Helper extends Overall[Meta { type T = IntData }] {
  def review(t: IntData) = new Meta {
    type T = IntData
    val m = IntData()
  }
}

Probably that's not what you want.

于 2013-07-28T14:23:26.900 回答