У меня есть следующая иерархия, и я хотел бы определить список любых Description
, но не могу определить его тип параметра.Scala более высокий тип экзистенциального типа
abstract class Context
class Local extends Context
class Browsing extends Context
abstract class Fruit[C <: Context]
class Apple[C <: Context](id: Int) extends Fruit[C]
class Banana[C <: Context](id: Int) extends Fruit[C]
abstract class Description[U[X <: Context] <: Fruit[X]] // U can't be covariant
class Apples extends Description[Apple]
class Bananas extends Description[Banana]
В принципе, я хотел бы что-то вроде этого (который не компилируется как есть):
val l: List[Description[_]] = List(
new Apples,
new Bananas
)
Любой путь для достижения этой цели?
Как вы предполагаете использовать этот 'L'? – talex
См. Http://stackoverflow.com/questions/32182694/how-to-define-an-existential-higher-kinded-type-in-scala или http://stackoverflow.com/questions/28176807/suppressing-unchecked- warning-for-a-high-kind-existential-type –
Фактически, я мог бы использовать суперкласс для 'Описание' без типа параметра и использовать методы для них. Но внутри 'Описание', я имею ссылку на другие объекты, параметризованные с помощью' U', и поэтому будет вынужден создавать суперкласс для них (и их дети ... это целая иерархия). Единственное, что нужно, - сохранить как можно больше информации о типе, не создавая дополнительных абстрактных слоев. – olivier