假设我有以下两个类型类:
object Foo {
sealed trait FooClass[A]
implicit object FooString extends FooClass[String]
implicit object FooInt extends FooClass[Int]
}
object Bar {
trait BarClass[A] //leave this one unsealed as we're attempting to prove that Foo is a subset of Bar, not the other way around.
implicit object BarString extends BarClass[String]
implicit object BarInt extends BarClass[Int]
implicit object BarDouble extends BarClass[Double]
}
是否有可能向编译器提供一个提示,即Foo是Bar的一个子集,以便以下编译,而不更改任何一种方法的类型签名?
class Outer(callee : Inner) {
import Foo._
def call[A : FooClass](a) : Unit = callee.call(a);
}
class Inner
import Bar._
def call[B : BarClass](b) : Unit = ();
}
val test = new Outer(new Inner)
test.call(123)
test.call("Hello World")
我的主要目标是允许Outer
类完全不知道BarClass
类型类的存在 - 使用Inner
类来完全抽象它。这可能吗?对于那些感兴趣的人,this git repository中有一些上下文 - 提交描述对我试图解决的问题有一些更详细的阐述。