Я хотел попробовать написать тип, методы которого могут быть однородными и возвращать значения одного и того же типа:
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
.