Scala Generics Covariance

Я пытаюсь реализовать канал, в котором вы отправляете изображение и выполняете различные процессы, добавляя информацию способом. Каждый шаг может нуждаться в информации из предыдущего шага, и информация может сильно отличаться. Для одного шага могут потребоваться все объекты на изображении, а для другого - цвета определенных пятен. Я пытаюсь понять, что для каждого шага нужны разные вещи. Шаги реализованы в виде связанного списка, в котором выходные данные одного являются входными данными следующего. Я создал этот объект: abstract class Parametrizable[T](val value: T, val name: String) который может получить все что угодно и имеет имя. Тем не менее, я не совсем понимаю, как это работает с моей текущей функцией. Это определение моей функции:

abstract def addMetadata[T](parameters: List[Parametrizable[Any]]): List[Parametrizable[Any]]

Вот некоторые из параметризуемых сыновей:

case class ParametrizableBufferedImage(override val value: BufferedImage)
  extends Parametrizable[BufferedImage](value, "image")

case class ParametrizableDetectedObjects(override val value: HashMap[String, List[DetectedObject]])
  extends Parametrizable[HashMap[String, List[DetectedObject]]](value, "detected-objects")

case class DetectedObject(image: BufferedImage,
                          classification: String,
                          accuracy: Double)

Оглядываясь вокруг, я обнаружил, что наследование в Scala ковариантно, но я не понимаю, как его реализовать. Это то, что я делал:

abstract def addMetadata[+T <: Parametrizable[Any]](parameters: List[T]): List[T]

Я знаю, что это не работает, потому что компилятор кричит на меня, но я не могу понять, почему. Спасибо.

0 ответов

Другие вопросы по тегам