Возможно ли иметь универсальный метод с привязкой к типу, который означает «каждый возможный конкретный подкласс этого признака, но не сам признак?»
В качестве примера предположим, что у меня есть следующая иерархия наследования:
sealed trait Fruit
case class Apple() extends Fruit
case class Orange() extends Fruit
...
case class Watermelon() extends Fruit
Я хочу определить метод def eatFruit[T <: ???](fruit: Seq[T])
, который позволит T
иметь тип Apple
, Orange
, Watermelon
и т. д., но не тип Fruit
. Тип, связанный с [T <: Fruit]
, очевидно, не выполняет эту работу.
Первоначальный стимул для этого заключается в том, что у нас есть класс FruitRepository
, который позволяет вставлять разные фрукты пакетно/оптом. Пакетная обработка выполняется извне по отношению к классу, поэтому на данный момент он имеет множество методов типа saveApples(apples: Seq[Apple])
, saveOranges(oranges: Seq[Orange])
и т. д., которые содержат много дублирующей логики, включающей создание оператора пакетного обновления. Я хотел бы управлять этим более общим способом, но любой метод saveFruit(fruit: Seq[Fruit])
позволит, например. список, содержащий как яблоки, так и апельсины, которые репозиторий не может обработать.
... Я также признаю, что теперь мне в целом любопытно, возможна ли такая привязка типов, даже если мы в конечном итоге решим проблему репозитория другим способом.