Возможно ли иметь универсальный метод с привязкой типа, которая составляет «каждый возможный конкретный подкласс этой черты, но не саму черту?»
В качестве примера предположим, что у меня есть следующая иерархия наследования:
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])
позволит, например, список, содержащий как яблоки, так и апельсины, который не может обработать хранилище.
... Я также признаю, что теперь мне, как правило, любопытно, возможен ли такой тип привязки типов, даже если мы решим проблему с хранилищем другим способом.