Попробуй исправить подписи
def getFromStore[Meta <: EntityMetadata, E[M <: EntityMetadata] <: Entity[M]](
id: E[Meta]#Id
): Option[E[VersionedMetadata]]
def getVersion[Meta <: EntityMetadata, E[M <: EntityMetadata] <: Entity[M]](
id: E[Meta]#Id
): Option[Long]
E[_]
и Entity[_]
в E[_] <: Entity[_]
различаются: E[_]
является конструктором типа (т.е. вы можете иметь тип E[M]
для каждого типа M
), Entity[_]
aka Entity[Meta] forSome { type Meta }
является экзистенциальным типом . Экзистенциальный тип не имеет .version
(retrieved.meta
был типа Any
).
Еще один способ исправить ваш код -
def getFromStore[Meta <: EntityMetadata, E[_] <: Entity[_]](
id: E[Meta]#Id
): Option[E[VersionedMetadata]]
def getVersion[Meta <: EntityMetadata, E[_] <: Entity[_ <: EntityMetadata]](
id: E[Meta]#Id
): Option[Int] = getFromStore(id).flatMap { retrieved =>
val typeTest: E[VersionedMetadata] = retrieved
retrieved.meta.maybeVersion
}
Я сохранил конструктор типа и экзистенциальный тип, но добавил верхнюю границу <: EntityMetadata
к параметру экзистенциального типа Entity[_ <: ...]
, который является верхней границей для параметра типа E[_] <: ...
. Теперь retrieved.meta
имеет тип, который является подтипом EntityMetadata
, поэтому он имеет .maybeVersion
вместо .version
(и map
следует заменить на flatMap
). Также Long
следует заменить на Int
.
Или вы можете поставить верхнюю границу _ <: VersionedMetadata
вместо моей <: EntityMetadata
. Тогда вы можете оставить .version
, .map
и Long
.