タイプセーフ コードとポリモーフィズムと継承を使用する外部 API との間のフロンティアを処理する方法がわからないため、イライラしています。
私の流れは以下です。クラス Class1 のエントリ値を受け取ります。これを使用して、外部サービスからクラス Class2 のアイテムを取得します。次に、両方をサブタイプして、それらの実行時の型を取得し、暗黙的なものを解決する必要があります。ただし、型消去のため、これは不可能です。
trait Typeclass1[A, B] {
def hash(a: A, b: B): String
}
trait Typeclass2[A, B] {
def hash(a: A, b: B): B
}
trait Entity
trait MyEntity1
trait MyEntity2
object db {
def load(any:Any):Entity = new Entity{}
}
class MyClass[T](t: T, a: String) {
def apply(timeout: Long): T = {
val loadFromDB = db.load(t)
loadFromDB match {
case myEntity1: MyEntity1 => applyTypeSafe(myEntity1)
case myEntity2: MyEntity2 => applyTypeSafe(myEntity2)
}
}
def applyTypeSafe[C](c: C)(implicit typeClass1: Typeclass1[C, T], typeclass2: Typeclass2[C, T]): (String, T) = {
typeClass1.hash(c, t) -> typeclass2.hash(c, t)
}
}
このフロンティア層を開発するのに正しいパターンは何だろうと思っています。MyClass のコンストラクターで提供する型クラスの型コンストラクターが必要になる可能性があります... または、設計を完全に再考する必要がありますか?