我想尝试编写一种类型,其方法可以是同质的并返回相同类型的值:
object SimpleTest {
trait Foo extends Product with Serializable {
type Self <: Foo
def bar: Self
}
case class X() extends Foo {
type Self = X
def bar = this
}
case class Y() extends Foo {
type Self = Y
def bar = this
}
trait TC[A]
implicit val tc: TC[Foo] = new TC[Foo] { }
def tester[A: TC](x: Seq[A]) = "foo"
// tester(Seq(X(), Y()))
}
不幸的是,注释掉的行调用tester
失败并出现以下错误(Scala 2.10):
Error: could not find implicit value for evidence parameter of type
SimpleTest.TC[SimpleTest.Foo{type Self >: SimpleTest.Y with SimpleTest.X <: SimpleTest.Foo}]
tester(Seq(X(), Y()))
^
X
基本上,我对为什么Y
不统一到感到困惑Foo
,这对于他们两个来说似乎是一个明确的 LUB。显然,类型成员使事情复杂化,但它的界限似乎得到了尊重。
在更高的层次上,我正在寻找一种轻量级的方法来获得等效的 F 有界多态性,而无需普遍类型参数的开销。这似乎最有效,但我需要添加强制X
并Y
统一到Foo
.