К сожалению, сейчас нет оператора типа OR
, как вы описали. Хорошая новость в том, что функция Union Types
является частью предстоящей Dotty: https://dotty.epfl.ch/docs/reference/new-types/union-types.html
В настоящее время такие проблемы обычно решаются с помощью следующих подходов:
Типы сумм
Вы можете объявить sealed trait
, который будет упаковывать все возможные экземпляры. Пожалуйста, смотрите следующий пример кода для получения более подробной информации:
// This is your base of sum type
sealed trait TopicResult
//Declared instances which you need to handle
case class RecordResult[T <: SpecificRecordBase](tag: ClassTag[T]) extends TopicResult
case object StringResult extends TopicResult
//Helper methods goes here for convenience
object TopicResult {
def record[T <: SpecificRecordBase](implicit tag: ClassTag[T]): TopicResult = RecordResult(tag)
def string: TopicResult = StringResult
}
def process(result: TopicResult /*other arguments*/): Unit = {
// This pattern matching should be safe, because you know all instances in advance.
result match {
case RecordResult(tag) => createStreamSpecificRecordBase(topic, source)
case StringResult => createStreamString(topic, source)
}
/// other operations
}
Ad-ho c полиморфный
Также известный как Type Class
шаблон. Вы можете извлечь поведение на основе его типа. Это довольно популярный подход, который вы можете увидеть в таких библиотеках, как cats
, circe
et c. Пожалуйста, смотрите пример кода ниже для получения более подробной информации:
// Type dependent logic interface
trait CreateTopic[T] {
def createTopic(topic: String, source: String): String // put desired result type here
}
object CreateTopic {
implicit def recordCreateTopic[T <: SpecificRecordBase](implicit tag: ClassTag[T]): CreateTopic[T] = {
(topic: String, source: String) => ??? // create topic for record base
}
implicit val stringCreateTopic: CreateTopic[String] = {
(topic: String, source: String) => ??? // create topic for record base
}
}
import CreateTopic._
// implementation will be substituted by compiler based on it's type, from implicit context
def process[T](/*other arguments*/)(implicit create: CreateTopic[T]): Unit = {
create.createTopic(topic, source)
/// other operations
}
Извините, я не эксперт по Kafka, поэтому, пожалуйста, исправьте меня, если вы найдете некоторые детали, которые не имеют смысла с точки зрения Кафки view.
Надеюсь, это поможет!