为什么Scala编译器不能将A
的类型参数Y
推断为Int
?
trait X[A]
trait Y[A] extends X[A]
object Foo extends X[Int] with Y
我是否有办法Y
可以了解X
的类型参数而未在Foo
声明中指定两次?我无法使用自键型解决方案。
答案 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)