Этого должно быть достаточно для вашего первого требования.
object Types {
sealed trait Request
object Request {
final case object ARequest extends Request
final case object BRequest extends Request
}
sealed trait Response
object Response {
final case object AResponse extends Response
final case object BResponse extends Response
}
trait TypePair[I <: Request, O <: Response]
object TypePair {
implicit final val ARequestAResponse: TypePair[Request.ARequest, Response.AResponse] =
new TypePair[Request.ARequest, Response.AResponse]
implicit final val BRequestAResponse: TypePair[Request.BRequest, Response.AResponse] =
new TypePair[Request.BRequest, Response.AResponse]
implicit final val BRequestBResponse: TypePair[Request.BRequest, Response.BResponse] =
new TypePair[Request.BRequest, Response.BResponse]
}
final class Execute[-I, +O](func: I => O)(implicit ev: TypePair[I, O]) {
def execute(in: I): O = func(in)
}
}
Я не совсем понимаю ваше второе требование, поэтому я не уверен, достаточно ли этого для того, что вам нужно. Если нет, не стесняйтесь оставлять свой отзыв и редактировать свой вопрос с более подробной информацией. Или откройте новый, если вы чувствуете, что проблема совсем другая.