У меня есть два класса: Guid и UserGuid. Guid имеет один аргумент типа. UserGuid - это частный случай Guid, который представляет объект (User), для которого нет класса, поэтому я реализовал его как Guid [Any].
У меня есть несколько методов применения для Guid, которые я хотел бы разделить между двумя типами, поэтому я поместил их в суперкласс (GuidFactory). Однако, поскольку Guid параметризован, я должен параметризовать типаж GuidFactory, в противном случае результирующий Guid будет параметризован как Guid [_].
В результате мой сопутствующий объект UserGuid не компилируется, жалуясь, что:
ошибка: com.wixpress.framework.scala.UserGuid не принимает параметров типа, ожидается: один объект UserGuid расширяет GuidFactory [UserGuid]
Можно ли каким-либо образом использовать методы apply между Guid и UserGuid, или я должен их дублировать или использовать приведение?
Код следует.
abstract class TypeSafeId[I, T](val id: I) extends Serializable
class Guid[T](override val id: String) extends TypeSafeId[String, T](id)
class UserGuid(override val id: String) extends Guid[Any](id)
trait GuidFactory[I[A] <: Guid[A]] {
def apply[T](id: String): I[T]
def apply[T](id: UUID): I[T] = apply(id.toString)
def apply[T](ms: Long, ls: Long): I[T] = apply(new UUID(ms, ls))
def apply[T](bytes: Array[Byte]):I[T] = apply(UUID.nameUUIDFromBytes(bytes))
def random[T] = apply[T](UUID.randomUUID())
}
object Guid extends GuidFactory[Guid] {
override def apply[T](id: String) = new Guid[T](id)
}
object UserGuid extends GuidFactory[UserGuid] {
override def apply(id: String) = new UserGuid(id)
}