Tengo dos clases, Guid y UserGuid. Guid tiene un argumento de tipo. UserGuid es un caso especial de Guid que representa una entidad (Usuario) para la que no hay clase, así que lo he implementado como Guid [Cualquiera].Supertipo genérico de objeto complementario en Scala
Tengo varios métodos de aplicación para Guid que me gustaría compartir entre los dos tipos, así que los puse en una superclase (GuidFactory). Sin embargo, como Guid está parametrizado, tengo que parametrizar el rasgo GuidFactory; de lo contrario, el Guid resultante se parametrizará como Guid [_].
Como resultado, mi compañero objeto UserGuid no compila, quejándose de que:
error: com.wixpress.framework.scala.UserGuid takes no type parameters, expected: one object UserGuid extends GuidFactory[UserGuid]
¿Hay alguna manera de poder compartir el GUID y métodos entre UserGuid o tengo que duplicar o utilizar la fundición se aplican?
El código a continuación.
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)
}
Los métodos de '' apply' en GuidFactory' no parecen hacer sentido para 'UserGuid'. P.ej. ¿Qué debe devolver 'UserGuid.apply [String] (" ")'? De acuerdo con 'GuidFactory', tendría el tipo' UserGuid [String] ', que no existe. –
que es exactamente el problema, quiero que sea UserGuid.apply ("1234"), no UserGuid.apply [String] ("1234"); lo cual debería tener sentido, ya que GuidFactory toma un parámetro de tipo I, que es un subtipo de Guid y tiene un parámetro, y UserGuid es un subtipo de Guid y proporciona un parámetro como Cualquiera ... –