特征类型参数推断

时间:2014-07-16 16:23:35

标签: scala

为什么Scala编译器不能将A的类型参数Y推断为Int

trait X[A]

trait Y[A] extends X[A]

object Foo extends X[Int] with Y

我是否有办法Y可以了解X的类型参数而未在Foo声明中指定两次?我无法使用自键型解决方案。

3 个答案:

答案 0 :(得分:1)

对于某些用例,使用中间类可以解决问题:

import scala.reflect.runtime.universe._

abstract class XBase {
  type A
  def say(a : A) : Unit = println(a)
}

trait Y extends XBase {
  override def say(a : A) : Unit = { 
      println("Hello ")
      super.say(a)
  }
}

class X[B : TypeTag] extends XBase {
   type A = B
}

object Foo extends X[Int] with Y

答案 1 :(得分:0)

Scala不支持类型声明中类型构造函数参数的推断(和省略)。这可能是在未来基于DOT演算的Scala版本中尝试统一类型参数和类型成员的。

例如,参见Odersky的演讲幻灯片The Trouble With Types(幻灯片29ff)。

答案 2 :(得分:0)

您需要在此表单中使用类型参数吗?在某些情况下,可以使用以下解决方案:

trait X { type A /* type parameter as member */ }
trait Y extends X
object Foo extends Y { type A = Int /* equivalent to Y[Int] or X [Int] */ }

它可用于定义。

trait X {
  type A 
  def xfun: A
}
trait Y extends X { def tuple[K](k: K): (K, A) = (k -> xfun) }
object Foo extends Y {
  def xfun = System.identityHashCode(this)
  type A = Int
}

然后如果测试:

scala> Foo.tuple("test")
res0: (String, Foo.A) = (test,2088931356)